Skip to main content
 首页 » 编程设计

python之django 1.8之DateTimeField 在测试期间接收 native 日期时间 RuntimeWarning

2024年10月24日42qq号

我有一个带有数据库迁移的 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。我认为这很奇怪,压缩的迁移应该可以解决这个问题。

我再次压缩了迁移,它不再发出警告。我无法解释为什么我认为我在第一次创建压扁的迁移时看到了 RuntimeWarning

请您参考如下方法:

只是为了带来这里讨论的内容,当 django 运行测试时,它将应用迁移并测试它们。但是,它可能不会显示正在应用的迁移,因此很难找到发生警告的位置。要使输出详细,请执行以下操作:

./manage.py test --verbosity 2 

然后可以通过查看详细输出找到导致问题的迁移。

如果您使用 South 进行迁移,那么在运行测试时禁用迁移很容易,这里是 answer关于它。我不确定如何在测试时禁用内置迁移的 django,但您可能会发现它很有用 here .