Django模型 - 更改选项字段中的选项并进行迁移

时间:2014-11-24 13:16:39

标签: django django-models django-south django-migrations

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

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

在此更改之前,我有相同的选项,但名称不同。现在我改变了项目中的所有内容以尊重新名称,但问题是更新数据库以显示这些新名称。我使用South进行数据迁移,据我所知,如果你需要在数据库中添加或删除一个列,那么编写自动迁移是相当简单的,但是我找不到一种方法来进行这种更新到我现有的专栏。

我使用Django 1.6。

3 个答案:

答案 0 :(得分:5)

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

$ 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

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

答案 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(使用您的移植进行迁移) 将添加更改)

  • python manage.py migrate your_app_name

另外here是南迁移的第一步教程。