【问题标题】:Django datetime default value in migrations迁移中的 Django 日期时间默认值
【发布时间】:2016-09-29 04:10:02
【问题描述】:

我已经阅读了一些关于这个问题的问题,this 问题没有为我的案例提供正确答案:

我在我已经存在的模型中添加了一个 created_time 字段,所以在属于该模型的 mysql 表中没有日期。

class Configs(models.Model):
    ...
    creation_date = models.DateTimeField(auto_now_add=True, blank=True)
    ...

我使用 python manage.py makemigrations 应用迁移

我得到这个错误:

您正在尝试将不可为空的字段“creation_date”添加到 没有默认值的集合;我们不能这样做(数据库需要 填充现有行的东西)。请选择一个修复:

我尝试了很多选择:

creation_date = models.DateTimeField(auto_now_add=True)

这个给出了同样的错误。

如果设置中的 USE_TZ 设置为 False,如何实现这种迁移?
顺便说一句,这是 Django 1.9.4 makemigrations 脚本中的错误吗?

【问题讨论】:

    标签: python mysql django django-migrations


    【解决方案1】:

    auto_now_add 设置创建实例时的当前日期时间,这在您的迁移过程中不会发生,因此您试图将NULL 保留为不可为空的字段。

    解决方案是为您的模型添加一个默认日期makemigrations,然后再次从模型中删除默认参数makemigrations,最后是migrate。您可以实现相同的效果,将 null=True 添加到字段,将 RunPythonRunSQL 添加到填充字段的迁移,然后从字段中删除 null=true

    最后,您可以合并两个迁移文件(或简单地自己编写)以如下方式结束:

    operations = [
        migrations.AddField(
            model_name='configs',
            name='creation_date',
            field=models.DateTimeField(auto_now_add=True, null=True, blank=True),
        ),
       migrations.RunPython(populate_dates),
       migrations.AlterField(
            model_name='configs',
            name='creation_date',
            field=models.DateTimeField(auto_now_add=True, blank=True),
        ),
    ]
    

    我只是写了,希望没有很多错别字

    【讨论】:

    • 重点是在设置null=False(或删除参数)之前,您需要填充所有现有行。您可以通过执行我上面解释的操作来实现这一点。你这样做了,但仍然得到同样的错误?
    • 谢谢,这句话:field=models.DateTimeField(auto_now_add=True, null=True, blank=True) 确实解决了我的问题,一旦从数据库结构中删除了先前 created_time 属性。
    • @Evhz:在 Django 3.2 中也适用于我。解决后,auto_now_add=False 显示 admin/model/<pk>/change 中的字段(打开以供编辑),auto_now=False 也是如此,而该字段隐藏在管理 change 视图中,当=True(不可编辑)。此行为可能与Django documentation 不同,或者我无法准确阅读文档?
    猜你喜欢
    • 2020-07-26
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2011-02-15
    • 1970-01-01
    相关资源
    最近更新 更多