为啥 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 格式可以正常工作,为啥?