postgresql Django没有正确迁移CharField

bjg7j2ky  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(150)

我有一个型号Car,带有CharField color,可以选择whiteblackblue

class Car(models.Model):

    WHITE = "White"
    BLACK = "Black"
    BLUE = "Blue"

    COLOR_CHOICES = (
        (WHITE, "White"),
        (BLACK, "Black"),
        (BLUE, "Blue"),
    )

    ...

    color = models.CharField(max_length=20, choices=COLOR_CHOICES, default=BLUE)

我已经用颜色创建了Car对象。现在,当我对选项进行更改时(例如:在所有情况下以及默认情况下将蓝色更改为红色)并运行迁移,则已经存在的颜色为蓝色的Car对象不会迁移到红色。这就是奇怪的开始:
1.当我使用django shell检查对象时,它们显示为Car. BLUE(不再存在的选项)。
1.当我在Django Admin中检查对象时,它们显示为Car.WHITE。
1.当我创建一个新对象时,它就工作了-它自动变成了Car.RED(拾取默认值)。
问题:

  • 迁移CharField选项时,是否遗漏了任何特定步骤?
  • 为什么会发生这种奇怪的行为,我该如何安全地修复?
  • 我必须手动(或通过脚本)修复数据吗?

我希望在迁移时,所有现有的Car.BLUE对象都迁移到Car.RED,因为这是新的默认值。我试图手动创建一个新的对象,它拿起新的默认红色。我还尝试手动将现有对象从蓝色更改为红色,这也很好。应用迁移时未出现错误。

  • Django版本-4.1.5 DB-PostgreSQL *
pgky5nke

pgky5nke1#

如果你改变**choices=…**参数[Django-doc],Django会进行迁移,事实上,如果你改变任何参数,Django都会进行迁移。但默认的迁移处理程序...当您更改choices时不会执行任何操作。可以实现不同的处理程序,但可能不值得这样做。
因此,这意味着最终不会进行任何数据库更改,因此我们必须自己进行更改。如果你想修改数据,你可以进行 * 数据迁移 * [Django-doc]。数据迁移就像普通的迁移一样,除了我们编写数据库应该如何更改。
我们通过以下方式进行数据迁移:

python manage.py makemigrations --empty app_name

在迁移文件中,我们可以构造一个更新查询:

from django.db import migrations

def red_to_blue(apps, schema_editor):
    Car = apps.get_model('app_name', 'Car')
    Car.objects.filter(color='Red').update(color='Blue')

class Migration(migrations.Migration):
    dependencies = [
        ("app_name", "1234_some_migration"),
    ]

    operations = [
        migrations.RunPython(red_to_blue),
    ]

如果我们随后进行迁移,它将运行red_to_blue函数,并迁移数据库中的数据。

相关问题