我有一个带有数据库迁移的 Django 项目。
MyModel.my_field 表示模型 MyModel
初始迁移有一个简单的日期时间作为默认值(即 datetime.datetime.now)
一个新的迁移现在将其作为 django.utils.timezone.now
我不加载任何固定装置作为迁移的一部分
每当我测试项目时,我都会收到此警告。
.../django/db/models/fields/__init__.py:1474: RuntimeWarning: DateTimeField MyModel.my_field received a naive datetime (2015-05-26 05:10:33) while time zone support is active.
起初我以为我疯了,找不到我在哪里设置天真的日期时间。但是我运行了一个虚拟测试(即一个与 MyModel 无关的测试用例,它什么也没做),我仍然收到警告。
这让我相信问题出在 django 创建数据库时的初始迁移。 我试图压缩迁移并重新运行测试,但我仍然收到相同的警告。
我应该看哪里?
我已经尝试按照文档中的指示将警告变成异常,但这似乎表明它是在创建数据库时发生的。
import warnings
warnings.filterwarnings(
'error', r"DateTimeField .* received a naive datetime",
RuntimeWarning, r'django\.db\.models\.fields')
初始迁移的相关部分:
migrations.CreateModel(
name='MyModel',
fields=[
('my_field', models.DateTimeField(default=datetime.datetime.now)),
],
options={
},
bases=(models.Model,),
),
我们更改默认值的迁移
class Migration(migrations.Migration):
dependencies = [
('myapp', '0003_auto_20150101_2018'),
]
operations = [
migrations.AlterField(
model_name='mymodel',
name='my_field',
field=models.DateTimeField(default=django.utils.timezone.now),
),
]
编辑
按照@shang-wang 下面的建议,我使用 --verbosity 2 运行了测试。 我能够看到导致问题的特定迁移。 基本上在初始和最后一次迁移之间,DateTimeField 将 auto_now_add 属性设置为 True。我认为这很奇怪,压缩的迁移应该可以解决这个问题。
我再次压缩了迁移,它不再发出警告。我无法解释为什么我认为我在第一次创建压扁的迁移时看到了 RuntimeWarning
请您参考如下方法:
只是为了带来这里讨论的内容,当 django 运行测试时,它将应用迁移并测试它们。但是,它可能不会显示正在应用的迁移,因此很难找到发生警告的位置。要使输出详细,请执行以下操作:
./manage.py test --verbosity 2
然后可以通过查看详细输出找到导致问题的迁移。
如果您使用 South 进行迁移,那么在运行测试时禁用迁移很容易,这里是 answer关于它。我不确定如何在测试时禁用内置迁移的 django,但您可能会发现它很有用 here .
