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 进行了测试。 我能够看到导致问题的特定迁移。 基本上在初始和最后一次迁移之间,DateTimeFieldauto_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