34

我在 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')]),
        ),
    ]
4

2 回答 2

37

在因重复提出票证并被关闭后,终于找到了答案:

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

参考:

于 2014-10-03T20:19:10.147 回答
2

来自 Django 文档:

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

参考:

于 2020-01-30T09:24:25.273 回答