由于旧迁移而发出警告 - 应该如何解决?

rwx*_*rwx 3 django django-models django-migrations

如果我运行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)
Run Code Online (Sandbox Code Playgroud)

但模型SignUpUser不再有这样的字段了。它被称为signup_timestamp. 其他字段也会出现同样的错误。为了解决这些问题,我datetime.now考虑更改为 django 内置时区timezone.now。但错误消息也不会消失。我认为这是由于旧的迁移而发生的。

该网站已经投入使用,但只有我在开发。我应该如何解决这个问题?重置所有迁移文件并使用 --fake-initial 重做迁移?

tbr*_*tbr 5

我遇到了类似的问题。DateTimeField我已经定义了with的默认值datetime.now并切换到了timezone.now。\n我在每次模型更改后创建了迁移(可能是为了测试它们)。这导致一次迁移定义了没有时区 ( 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)),)。

\n\n

当运行模型 ( ) 的测试时,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.

\n\n

Django 似乎试图将迁移应用到已经定义了时区感知的数据库。不知道为什么会这样做,但这似乎正在发生。

\n\n

为了防止出现警告,我必须将迁移压缩为将默认值更改为时DateTimeFiled区感知的迁移。\n就我而言,这是迁移0007,同时0006添加了默认值而没有时区意识。\n所以创建南瓜的命令是:

\n\n
$ python manage.py squashmigrations app_name 0007\n
Run Code Online (Sandbox Code Playgroud)\n\n

这创建了一个新的迁移文件,其中包含通过0001_squashed_0007_auto_20180803_2122.py迁移所做的所有更改。正如文档所述,这是以优化的方式发生的,因此仅构建一系列迁移的最终结果,而无需中间步骤。00010007

\n\n

在新安装中,不会仅运行新的压缩迁移00010007运行单独的迁移。\n您应该将原始迁移保留一段时间,以确保压缩不会引入任何问题:

\n\n
\n

一旦您\xe2\x80\x99压缩了迁移,您应该将其与它所替换的迁移一起提交,并将此更改分发到应用程序的所有正在运行的实例,确保它们运行迁移以将更改存储在数据库中。

\n\n

然后,您必须通过以下方式将压缩的迁移转换为正常迁移:

\n\n
    \n
  • 删除它替换的所有迁移文件。
  • \n
  • 将依赖于已删除迁移的所有迁移更新为依赖于压缩的迁移。
  • \n
  • 删除压缩迁移的 Migration 类中的 Replaces 属性(这就是 Django 告诉它是压缩迁移的方式)。
  • \n
\n
\n