我有一个型号Car
,带有CharField color
,可以选择white
,black
和blue
。
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 *
1条答案
按热度按时间pgky5nke1#
如果你改变**
choices=…
**参数[Django-doc],Django会进行迁移,事实上,如果你改变任何参数,Django都会进行迁移。但默认的迁移处理程序...当您更改choices
时不会执行任何操作。可以实现不同的处理程序,但可能不值得这样做。因此,这意味着最终不会进行任何数据库更改,因此我们必须自己进行更改。如果你想修改数据,你可以进行 * 数据迁移 * [Django-doc]。数据迁移就像普通的迁移一样,除了我们编写数据库应该如何更改。
我们通过以下方式进行数据迁移:
在迁移文件中,我们可以构造一个更新查询:
如果我们随后进行迁移,它将运行
red_to_blue
函数,并迁移数据库中的数据。