折叠 Django 迁移中的重复外键值



我有一个 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并将唯一要求更改为仅xy

但首先,我需要执行数据迁移,删除即将到来的重复条目,并且需要修复所有外键以指向该单个合并条目。

我正在寻找是否有比我在下面的答案中概述的更好的方法。 我对我的答案并不完全满意,因为它没有任何保护措施来删除仍在使用的外键——除了算法本身。 (比如,如果还有另一个外键关系C我忽略了怎么办。

(Django 1.7 & Postgres)

以下是看起来最直接的步骤:

  • 进行迁移以删除zunique_together约束。
  • 进行数据迁移
    • 对于每个A对象,查找具有最小idc对象,并将A.c重新分配给该对象。
    • 对于每个B对象,查找具有最小idc对象,并将B.c重新分配给该对象。
    • 得到所有C的列表和AB引用的所有C的列表,减去集合并delete()余数。
  • 进行迁移以恢复unique_together

最新更新