我有一个需要执行迁移的Django应用程序。这是我需要修改的代表模式:
class A(Model):
c = ForeignKey(C)
...
class B(Model):
c = ForeignKey(C)
...
class C(Model):
x = CharField()
y = CharField()
z = CharField()
class Meta:
unique_together = (('x', 'y', 'z'),)
z
不再与外键C
的唯一性相关。因此,我将删除字段z
并将唯一要求更改为x
和y
。
但首先我需要进行数据迁移,删除即将发生的重复条目,和我需要修复所有的ForeignKeys以指向该单个合并条目。
我正在寻找一种比我在下面的答案中概述的更好的方法。我对我的回答并不完全满意,因为它没有任何保护措施来删除仍在使用的外键 - 除了算法本身。 (比如,如果我忽略了C
还存在另一个外键关系,那该怎么办。)
(Django 1.7& Postgres)
答案 0 :(得分:0)
以下是最直接的步骤:
z
和unique_together
约束。A
对象,找到c
最小的id
对象,并将A.c
重新分配给该对象。B
对象,找到c
最小的id
对象,并将B.c
重新分配给该对象。C
的列表以及C
和A
引用的所有B
的列表,减去这些集合和delete()
其余部分。unique_together
。