django 1.8 - DateTimeField 在测试期间接收本机日期时间 RuntimeWarning
django 1.8 - DateTimeField receives native datetime RuntimeWarning during testing
我有一个带有数据库迁移的 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
只是为了带来这里讨论的内容,当 django 运行 测试时,它将应用迁移并测试它们。但是,它可能不会显示正在应用的迁移,因此很难找到发生警告的位置。要使输出详细,请执行:
./manage.py test --verbosity 2
然后可以通过查看详细输出找到导致问题的迁移。
如果您使用 South
进行迁移,那么在 运行 测试时禁用迁移很容易,这里是 answer about it. I'm not sure how to disable django built in migration when testing, but you might find it useful here。
我有一个带有数据库迁移的 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
。我觉得这很奇怪,压缩的迁移应该可以解决这个问题。
我再次压缩了迁移,它不再发出警告。我无法解释为什么我认为我第一次创建 squashed migratons 时看到了 RuntimeWarning
只是为了带来这里讨论的内容,当 django 运行 测试时,它将应用迁移并测试它们。但是,它可能不会显示正在应用的迁移,因此很难找到发生警告的位置。要使输出详细,请执行:
./manage.py test --verbosity 2
然后可以通过查看详细输出找到导致问题的迁移。
如果您使用 South
进行迁移,那么在 运行 测试时禁用迁移很容易,这里是 answer about it. I'm not sure how to disable django built in migration when testing, but you might find it useful here。