2016-12-15 44 views
-1

我有一個需要在其上執行遷移的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

但首先我需要做一個數據遷移,即丟棄即將到來的重複條目,我需要修復所有ForeignKeys以指向單個統一條目。

我期待,如果有比我將在我的回答如下勾勒出一個更好的辦法。我對我的回答並不完全滿意,因爲它沒有任何保護措施來丟棄仍在使用的外鍵 - 除了算法本身。 (喜歡什麼,如果有也是C另一個外鍵關係我忽視了。)

(Django的1.7 &的Postgres)

回答

0

這裏是一個似乎是最簡單的步驟:

  • 做一個遷移刪除zunique_together約束。
  • 做數據遷移
    • 對於每個A對象找到具有最小idc對象,並重新分配A.c到該對象。
    • 對於每個B對象找到最小的id的對象c,並將該對象重新指定爲B.c
    • 獲取所有C的列表和所有C的列表AB,減去集合和delete()其餘部分。
  • 進行遷移以恢復unique_together