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
这将在您的迁移文件夹中创建一个新的空白迁移。您必须手动创建 forwards
和 backwards
方法来更改您想要的数据:
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 模型 - 在选择字段中更改选项并迁移的主要内容,如果未能解决你的问题,请参考以下文章