我有一个 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
。
但首先,我需要执行数据迁移,删除即将到来的重复条目,并且需要修复所有外键以指向该单个合并条目。
我正在寻找是否有比我在下面的答案中概述的更好的方法。 我对我的答案并不完全满意,因为它没有任何保护措施来删除仍在使用的外键——除了算法本身。 (比如,如果还有另一个外键关系C
我忽略了怎么办。
(Django 1.7 & Postgres)
以下是看起来最直接的步骤:
- 进行迁移以删除
z
和unique_together
约束。 - 进行数据迁移
- 对于每个
A
对象,查找具有最小id
的c
对象,并将A.c
重新分配给该对象。 - 对于每个
B
对象,查找具有最小id
的c
对象,并将B.c
重新分配给该对象。 - 得到所有
C
的列表和A
和B
引用的所有C
的列表,减去集合并delete()
余数。
- 对于每个
- 进行迁移以恢复
unique_together
。