6

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

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

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

我使用 Django 1.6。

4

3 回答 3

6

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

$ 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

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

于 2014-11-24T14:36:59.760 回答
5

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

>>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

此外,由于它是一次性脚本,因此速度应该不是主要问题。

希望这可以帮助

于 2014-11-27T05:03:19.037 回答
0

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

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

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

对于 Django 1.6:

  • 点安装南

  • -python manage.py schemamigration your_app_name --initial

  • -python manage.py 迁移 your_app_name

  • 更改您的模型

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

  • python manage.py 迁移 your_app_name

这里还有南迁的第一步教程。

于 2014-11-24T13:19:28.457 回答