2016-12-15 4 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に別の外部キー関係もあります。)

(ジャンゴ1.7 &のPostgres)

答えて

0

ここで最もまっすぐ進むように見えるの手順です:

  • を作るには移行はzunique_togetherの制約になります。
  • Aオブジェクトのデータ移行
    • が最小idcオブジェクトを検索し、そのオブジェクトにA.cを再割り当てしてください。
    • Bオブジェクトごとに、idが最小のcオブジェクトを見つけて、そのオブジェクトにB.cを再割り当てします。
    • CさんのリストとABで参照されているCのリストをすべて取得し、残りをdelete()から引きます。
  • unique_togetherを元に戻す移行を行います。
関連する問題