【问题标题】:django 1.8 - DateTimeField receives native datetime RuntimeWarning during testingdjango 1.8 - DateTimeField 在测试期间接收本机日期时间 RuntimeWarning
【发布时间】: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 运行了测试。 我能够看到导致问题的特定迁移。 基本上在初始和最后一次迁移之间,DateTimeFieldauto_now_add 属性设置为True。我认为这很奇怪,压缩迁移应该可以解决这个问题。

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

【问题讨论】:

  • 你能不能./manage.py test --verbosity 2 看看测试开始时django 是否会开始应用迁移?
  • 多么棒的建议!我现在可以看到导致问题的特定迁移。请查看我的编辑以进行更新。
  • 如果您愿意,可以留下答案,我会接受。谢谢

标签: python django datetime django-models django-migrations


【解决方案1】:

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

./manage.py test --verbosity 2

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

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

【讨论】:

    猜你喜欢
    • 2014-03-28
    • 2019-08-06
    • 2021-01-27
    • 1970-01-01
    • 2014-01-29
    • 2016-03-08
    • 2017-11-28
    • 2020-10-13
    • 1970-01-01
    相关资源
    最近更新 更多