如果我运行python -Wall manage.py test
,则会发出此警告(和类似情况):
/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py:1453:
RuntimeWarning: DateTimeField SignUpUser.signup_time received a naive datetime (2018-03-17 21:27:22.620074) while time zone support is active.RuntimeWarning)
但是模型SignUpUser
已经没有这样的字段了。它被称为signup_timestamp
。其他字段也会出现相同的错误。为了解决这些问题,我考虑datetime.now
将timezone.now
更改为django内置时区。但错误消息也不会消失。我认为这是因为旧的迁移。
该网站已经投入生产,但只有我在开发。我该怎么解决这个问题?重置所有迁移文件并使用--fake-initial?
重做迁移答案 0 :(得分:1)
我遇到了类似的问题。我已经用DateTimeField
定义了datetime.now
的默认值,并切换到timezone.now
。
每次模型更改后,我都创建了迁移(可能是为了测试它们)。这导致一次迁移定义了不带时区(field=models.DateTimeField(default=datetime.datetime(2018, 8, 2, 22, 15, 4, 702061)),
)的默认值,而下一次迁移将解决此问题并添加时区(field=models.DateTimeField(default=datetime.datetime(2018, 8, 3, 19, 22, 32, 951341, tzinfo=utc)),
)。
运行模型(python manage.py test app_name
)的测试时,结果为:[...]/django/db/models/fields/__init__.py:1423: RuntimeWarning: DateTimeField Job.sub_date received a naive datetime (2018-08-02 22:15:04.702061) while time zone support is active.
似乎Django尝试将迁移应用于已经定义了时区感知的数据库。不知道为什么这样做,但是那似乎还在继续。
为防止发生警告,我不得不将迁移压缩到将DateTimeFiled
的默认值更改为可识别时区的迁移。
在我的情况下,这是迁移0007
,而0006
在没有时区感知的情况下添加了默认值。
因此,创建壁球的命令是:
$ python manage.py squashmigrations app_name 0007
这创建了一个新的迁移文件0001_squashed_0007_auto_20180803_2122.py
,其中包含迁移0001
到0007
所做的所有更改。就像documentation所说的那样,这是以优化的方式发生的,因此只构建了一系列迁移的最终结果,而没有中间步骤。
在新安装的系统上,将运行新的压缩迁移,而不是运行从0001
到0007
的单独迁移。
您应将原始迁移保留一段时间,以确保压扁不会引起任何问题:
一旦压缩了迁移,则应将其与替换的迁移一起提交,并将此更改分发到应用程序的所有正在运行的实例,确保它们进行迁移以将更改存储在数据库中。
然后您必须通过以下方法将压缩的迁移迁移到正常迁移:
- 删除所有替换的迁移文件。
- 将所有依赖于已删除迁移的迁移更新为压缩迁移。
- 删除压缩迁移的Migration类中的replaces属性(这是Django告诉它是压缩迁移的方式)。
答案 1 :(得分:0)
我有类似的情况,我的model.py也是如此,
class SampleModel(models.Model):
name = models.CharField(max_length=120)
age = models.IntegerField()
address = models.CharField(max_length=100)
date = models.DateTimeField(default=datetime.now())
当我进行迁移时,它会显示警告。
申请 sample.0004_samplemodel_date ... /家庭/ JPG / virtual_env / django_1_11 / lib中/ python3.6 /站点包/ Django的/ DB /模型/场/ 的init 的.py:1447: RuntimeWarning:DateTimeField SampleModel.date收到了一个天真的 datetime(2018-03-18 04:59:45.357527),而时区支持是 活性。 RuntimeWarning)
我所做的是,从default=datetime.now()
移除models.py
并运行makemigrations
和migrate
命令
注意:你说,它在生产中,所以只有在备份后才这样做