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

时间:2016-12-15 17:49:57

标签: django django-migrations

我有一个需要执行迁移的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

但首先我需要进行数据迁移,删除即将发生的重复条目,我需要修复所有的ForeignKeys以指向该单个合并条目。

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

(Django 1.7& Postgres)

1 个答案:

答案 0 :(得分:0)

以下是最直接的步骤:

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