Django迁移改变了选择价值

时间:2017-10-26 02:40:32

标签: mysql django

以前在我的一个MySQL表中添加了一个字段:

# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2017-09-14 00:49
from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('my_app', '0102_previous_migrations'),
    ]

    operations = [
        migrations.AddField(
            model_name='my_client',
            name='my_team',
            field=models.CharField(choices=[('Unassigned', 'Unassigned'), ('ACT', 'ACT'), ('Korea', 'Korea'), ('National', 'National')], default='Unassigned', max_length=255, verbose_name='My Team'),
        ),
    ]

因此,用户可以在我的UI中选择上述选项,并将其保存到表my_client中:

  • 未分配
  • ACT
  • 韩国
  • 国家

已经部署了这些变化,现在像我这样的初学者希望改变,即删除韩国并添加2个新选择:NSW和SA

我该怎么做?我是否需要进行其他迁移?或者我只需要在模型中更改这些选择?

我现在在我的模型中使用这个:

class Client(MyAppModel):
    TEAM_CHOICES = (
        ('Unassigned', 'Unassigned'),
        ('ACT', 'ACT'),
        ('Korea', 'Korea'),
        ('National', 'National'),
)

DEFAULT_TEAM = 'Unassigned'
my_team = models.CharField(verbose_name='MyTeam', null=False, max_length=255, choices=TEAM_CHOICES, default=DEFAULT_TEAM)

更新

根据我的评论,我还需要一个迁移,一个AlterField?

我是否还必须立即更新表my_client中的所有现有值,如果他们中的任何一个有韩国说未分配,如果我想删除韩国作为选择?我可以在迁移中使用什么命令?

2 个答案:

答案 0 :(得分:1)

稍后想出来,希望它能帮助像我这样的其他初学者。

我必须更新客户端模型

class Client(MyAppModel):
    TEAM_CHOICES = (
        ('Unassigned', 'Unassigned'),
        ('National', 'National'),
        ('NSW', 'NSW'),
        ('SA', 'SA'),
)

然后输入以下命令:

python manage.py makemigrations

将生成迁移:

from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

    dependencies = [
        ('my_app', '0102_previous_migrations'),
    ]

    operations = [
        migrations.AlterField(
            model_name='my_client',
            name='my_team',
            field=models.CharField(choices=[('Unassigned', 'Unassigned'), ('ACT', 'ACT'), ('National', 'National'), ('NSW', 'NSW'), ('SA', 'SA')], default='Unassigned', max_length=255, verbose_name='My Team'),
        ),
    ]

接下来立即更新表中的所有现有值,引用here,输入此命令以创建空迁移文件:

python manage.py makemigrations --empty my_app

在新的迁移文件中,输入如下内容:

# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2017-10-26 06:36
from __future__ import unicode_literals

from django.db import migrations

def set_unassigned(apps, schema_editor):
    Client = apps.get_model('my_app', 'my_client')
    for client in Client.objects.all():
        client.account_team = 'Unassigned'
        client.save()

class Migration(migrations.Migration):

    dependencies = [
        ('my_app', '0104_client_team_update'),
    ]

    operations = [
        migrations.RunPython(set_unassigned),
    ]

答案 1 :(得分:1)

高级方法:

创建仅添加新选择的迁移。编写一种方法以采用所有旧选择的模型,并为它们提供适当的新选择migration.RunPython。创建一个删除旧选择的迁移。