2015-09-09 25 views
2

我有一个包含数据库迁移的django项目。
MyModel.my_field表示基于模型MyModeldjango 1.8 - DateTimeField在测试期间接收本地日期时间RuntimeWarning

的初始迁移有幼稚日期时间作为默认值的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), 
     ), 
    ] 

编辑

继@尚旺建议下面我跑用--verbosity 2.进行测试我能够看到导致此问题的特定迁移。 基本上在初始和最后一次迁移之间DateTimeField得到了auto_now_add属性设置为True。我认为这很奇怪,并且压扁的迁移应该解决这个问题。

我再次压扁了迁徙,它不再发出警告。我没有解释为什么我以为我第一次看到RuntimeWarning第一次创建了压扁的migratons

+0

你可以做'。/manage.py test --verbosity 2'并查看django是否会在测试开始时开始应用迁移? –

+0

多么伟大的建议!我现在可以看到导致问题的具体迁移。请参阅我的编辑更新。 –

+0

如果你想你可以留下一个答案,我会接受它。谢谢 –

回答

2

只是为了让这里讨论的内容,当django运行测试时,它将应用迁移并测试它们。然而,它可能不会显示它正在应用的迁移,因此找到发生警告的位置并不明显。为了使输出详细,这样做:

./manage.py test --verbosity 2 

然后导致这一问题的迁移可以通过查看冗长的输出被发现。

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

相关问题