为啥 django 1.7 会为字段选择的变化创建迁移?

Posted

技术标签:

【中文标题】为啥 django 1.7 会为字段选择的变化创建迁移?【英文标题】:Why does django 1.7 creates migrations for changes in field choices?为什么 django 1.7 会为字段选择的变化创建迁移? 【发布时间】:2014-11-26 23:00:36 【问题描述】:

我在 1.7 版中观察到了这种行为,但在使用南迁移的先前版本中没有。

例如。

class RedemptionCode(models.Model):
    EXPIRE_OPTIONS = (
        ('1 week', '1 Week'),
    )

    expire_option = models.CharField(max_length=255, choices=EXPIRE_OPTIONS)

当我添加更多选项时:

EXPIRE_OPTIONS = (
    ('1 week', '1 Week'),
    ('2 weeks', '2 Weeks'),
    ('1 month', '1 Month'),
    ('1 day', '1 Day'),
)

并运行makemigrations,它会为它创建一个迁移,来自south 背景我认为它应该说没有检测到更改,因为它不会影响数据库架构。我不知道它有什么用途:

class Migration(migrations.Migration):

    dependencies = [
        ('credits', '0001_initial'),
    ]

    operations = [
        migrations.AlterField(
            model_name='redemptioncode',
            name='expire_option',
            field=models.CharField(max_length=255, choices=[('1 week', '1 Week'), ('2 weeks', '2 Weeks'), ('1 month', '1 Month'), ('1 day', '1 Day')]),
        ),
    ]

【问题讨论】:

因为我得到了几个赞成票,在我看来这没有记录,因此我创建了一张票 code.djangoproject.com/ticket/23586 看看我对类似问题的回答***.com/a/29233569/3025188干杯! 对于其他任何人来说,这篇博文tech.yunojuno.com/pro-tip-django-choices-and-migrations 展示了一个很好的解决方案。 【参考方案1】:

在举票因重复而被关闭后,终于找到了答案:

这是设计使然。有几个原因,尤其是对我而言,历史上的数据迁移需要对模型进行完全准确的表示,包括它们的所有选项,而不仅仅是影响数据库的选项。

参考:

https://code.djangoproject.com/ticket/22837 https://code.djangoproject.com/ticket/23581

【讨论】:

【参考方案2】:

来自 Django 文档:

Django 将对模型或字段的任何更改进行迁移 - 甚至是不影响数据库的选项 - 因为它可以正确重建字段的唯一方法是拥有历史中的所有更改,并且您可能需要稍后在某些数据迁移中使用这些选项(例如,如果您设置了自定义验证器)。

参考:

https://docs.djangoproject.com/en/dev/topics/migrations/

【讨论】:

以上是关于为啥 django 1.7 会为字段选择的变化创建迁移?的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.7 - makemigrations 为非托管模型创建迁移

在 Django 1.7 迁移中调用 loaddata 会抛出“‘字段列表’中的未知列‘[字段]’”

在 Django loaddata 中,它会为 json 格式抛出错误,但对于 yaml 格式可以正常工作,为啥?

更改模型以添加“通过”关系以订购多对多字段 - Django 1.7 迁移修改

Django 1.7 和 1.8 之间迁移行为的变化

为啥当 Debug 设置为 False 时,Django 会为静态媒体生成 HTTP 500 错误?