Django 模型 - 在选择字段中更改选项并迁移

Posted

技术标签:

【中文标题】Django 模型 - 在选择字段中更改选项并迁移【英文标题】:Django model - changing options in a choices field and migrate 【发布时间】:2015-01-22 05:18:21 【问题描述】:

我需要更改模型状态字段中的选项名称,需要变成

   STATUS = Choices(
    ('option_A', 'Option A'),
    ('option_B', 'Option B'),
   )

在此更改之前,我有相同的选项,但名称不同。现在我更改了项目中的所有内容以尊重新名称,但问题在于更新数据库以显示这些新名称。我使用 South 进行数据迁移,据我了解,如果您需要添加或删除数据库中的列,让它编写自动迁移相当简单,但我找不到对我的更新进行此更新的方法现有列。

我使用 Django 1.6。

【问题讨论】:

【参考方案1】:

您正在寻找的是数据迁移。

$ python manage.py datamigration your_app_label

这将在您的迁移文件夹中创建一个新的空白迁移。您必须手动创建 forwardsbackwards 方法来更改您想要的数据:

def forwards(self, orm):
    orm.MyModel.objects.filter(status='old_option_A').update(status='option_A')
    ...

def backwards(self, orm):
    # reverse of forwards, or raise an error to prevent backwards migrations

您需要使用orm.MyModel 而不是直接导入模型才能使其工作。

然后,只需运行迁移:

$ python manage.py migrate your_app_label

请确保在版本控制系统的同一提交中同时包含迁移和选项更改,这样它们将始终同步(只要人们记得迁移到新版本)。

【讨论】:

我正在使用 Django 1.11,并且似乎删除了管理命令 python manage.py datamigration your_app_label?并且应该改为:docs.djangoproject.com/en/1.11/topics/migrations/…【参考方案2】:

您可以编写一个快速脚本来进行更改。如下所示:

>>Model.objects.filter(status = "some_old_value").update(status = "new_value")

其中“状态”是字段名称。 您可以重复上述步骤,将同一模型中的任何类型的旧值更改为新值。

Update() 速度更快,在中等大小的数据库上运行不需要很长时间 https://docs.djangoproject.com/en/dev/topics/db/queries/#updating-multiple-objects-at-once

而且由于它是一次性脚本,所以速度应该不是主要问题。

希望对你有帮助

【讨论】:

【参考方案3】:

更改字段后,您应该运行:

$ python manage.py makemigrations your_app_label
$ python manage.py migrate 

(这项工作适用于 Django 1.7,其中 South 包含在 Django 包中)

对于 Django 1.6:

pip install 南

-python manage.py schemamigration your_app_name --initial

-python manage.py migrate your_app_name

更改您的模型

manage.py schemamigration your_app_name --auto(使用您的迁移 将添加更改)

python manage.py migrate your_app_name

还有here 是南迁的第一步教程。

【讨论】:

对不起,我应该说我使用的是 Django 1.6。我猜这行不通? 我知道 South,自动生成迁移(schemamigration)的输出是“似乎没有任何改变” @martina 可以编写自己的迁移。但也许不需要迁移。您可以尝试在您的选择中更改名称并检查之后是否会出现一些数据库错误。可能根本不需要创建迁移。

以上是关于Django 模型 - 在选择字段中更改选项并迁移的主要内容,如果未能解决你的问题,请参考以下文章

选择特定选项后,如何更改 Django 模型字段的值?

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

Django 迁移使用 RunPython 提交更改

Django 迁移使用 RunPython 提交更改

如何在 django 中更改模型时填充数据库字段

Django模型南0.7.6迁移问题:表中的任何更改与另一个字段的默认值百分比