我需要在模型状态字段中更改选项的名称,该字段需要变为
STATUS = Choices( ('option_A', 'Option A'), ('option_B', 'Option B'), )
在此更改之前,我有相同的选项,但名称不同。现在我改变了项目中的所有内容以尊重新名称,但问题是更新数据库以显示这些新名称。我使用South进行数据迁移,据我所知,如果你需要在数据库中添加或删除一个列,那么编写自动迁移是相当简单的,但是我找不到一种方法来进行这种更新到我现有的专栏。
我使用Django 1.6。
答案 0 :(得分:5)
您正在寻找的是数据迁移。
$ 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
确保在版本控制系统的同一提交中包含选项中的迁移和更改,因此这些将始终同步(只要人们记得在新版本上迁移)。
答案 1 :(得分:5)
您可以编写一个快速脚本来进行更改。这样的事情:
>>Model.objects.filter(status = "some_old_value").update(status = "new_value")
'status'是字段名称。 您可以重复上述步骤,将任何类型的旧值更改为同一模型中的新值。
Update()速度更快,不需要花费很长时间才能在中等大小的数据库上运行 https://docs.djangoproject.com/en/dev/topics/db/queries/#updating-multiple-objects-at-once
此外,由于它是一次性脚本,速度不应该是一个主要问题。
希望这有帮助
答案 2 :(得分:0)
更改字段后,您应该运行:
$ python manage.py makemigrations your_app_label
$ python manage.py migrate
(这项工作适用于Django 1.7,其中South包含在Django包中)
对于Django 1.6:
pip install South
-python manage.py schemamigration your_app_name --initial
-python manage.py migrate your_app_name
更改模型
manage.py schemamigration your_app_name --auto(使用您的移植进行迁移) 将添加更改)
另外here是南迁移的第一步教程。