因旧迁移而发出警告 - 应如何解决?

时间:2018-03-17 20:52:37

标签: 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)

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

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

重做迁移

2 个答案:

答案 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,其中包含迁移00010007所做的所有更改。就像documentation所说的那样,这是以优化的方式发生的,因此只构建了一系列迁移的最终结果,而没有中间步骤。

在新安装的系统上,将运行新的压缩迁移,而不是运行从00010007的单独迁移。 您应将原始迁移保留一段时间,以确保压扁不会引起任何问题:

  

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

     

然后您必须通过以下方法将压缩的迁移迁移到正常迁移:

     
      
  • 删除所有替换的迁移文件。
  •   
  • 将所有依赖于已删除迁移的迁移更新为压缩迁移。
  •   
  • 删除压缩迁移的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并运行makemigrationsmigrate命令

注意:你说,它在生产中,所以只有在备份后才这样做