【问题标题】:Django migrations changing choices valueDjango迁移改变选择值
【发布时间】:2020-11-11 04:25:26
【问题描述】:

之前我的一个 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 中:

  • 未分配
  • 行动
  • 韩国
  • 全国

更改已部署,现在像我这样的初学者想要更改,即删除韩国并添加 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 中的所有现有值?我可以在迁移中使用什么命令?

【问题讨论】:

  • 感谢@solarissmoke,如果迁移并没有显示出只是选择的变化,迁移会是什么样子?
  • 它应该只显示不断变化的选择。你的是什么样子的?

标签: mysql django


【解决方案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),
    ]

【讨论】:

    【解决方案2】:

    高级方法:

    创建一个只添加新选择的迁移。编写一个方法来获取所有具有旧选择的模型,并给它们一个适当的新选择migration.RunPython。创建一个移除旧选择的迁移。

    【讨论】:

      猜你喜欢
      • 2019-08-18
      • 2015-01-22
      • 2016-08-27
      • 1970-01-01
      • 2017-07-04
      • 2015-10-19
      • 2021-10-26
      • 1970-01-01
      • 2018-11-29
      相关资源
      最近更新 更多