【发布时间】:2015-12-05 19:56:30
【问题描述】:
我有一个包含数据库迁移的 django 项目。MyModel.my_field 表示模型 MyModel 上的 DateTimeField
初始迁移有一个简单的日期时间作为默认值(即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。我认为这很奇怪,压缩迁移应该可以解决这个问题。
我再次压制了迁移,它不再发出警告。我无法解释为什么我认为我在第一次创建 squashed migratons 时看到了 RuntimeWarning
【问题讨论】:
-
你能不能
./manage.py test --verbosity 2看看测试开始时django 是否会开始应用迁移? -
多么棒的建议!我现在可以看到导致问题的特定迁移。请查看我的编辑以进行更新。
-
如果您愿意,可以留下答案,我会接受。谢谢
标签: python django datetime django-models django-migrations