2017-02-10 15 views
2

Djangoには複合外部キーが必要ですが、これはサポートされていません。 DBに手動で追加することもできますが、モデル定義(sadpanda)には反映されません。 バックエンドDBはポストグルです。ここでDjangoの複合外部キー

は私のモデルです:

class Trial(models.Model): 
    kit = models.ForeignKey(to='Kit') 

class Kit(models.Model): 
    name = models.CharField(max_length=500) 


class Component(models.Model): 
    kit = models.ForeignKey(null=True, blank=True, to='Kit', related_name='components') 


class ComponentOverride(models.Model): 
    trial = models.ForeignKey(to='Trial') 
    kit = models.ForeignKey(to='Kit') 
    component_to_replace = models.ForeignKey(to='Component', related_name='replaced') 
    component_replace_with = models.ForeignKey(to='Component', related_name='replaced_with') 

私は列のComponentOverrideテーブルの外部キー制約が試用テーブルにidとキットのid列に(モデルにおける試験とキット)trial_idとkit_idたいです(idは自動的にdjangoによって作成され、モデルのキットは表のkit_idです)。

基本的に私はに相当したい:私は裁判ごとに複数のコンポーネントのオーバーライドがあることができ、ので、私は複合キーが必要だと思う

ALTER TABLE app_label_trial 
    ADD CONSTRAINT app_label_trial_unique_trial_id_kit_id 
    UNIQUE (id, kit_id); 
ALTER TABLE app_label_componentoverride 
    ADD CONSTRAINT app_label_componentoverride_comp_constraint_trial_id_kit_id 
    FOREIGN KEY (kit_id, trial_id) 
    REFERENCES app_label_trial(id, kit_id) 
    DEFERRABLE INITIALLY DEFERRED; 

を。

トライアルには、多くのコンポーネントを含むキットが1つあります。ただし、試用版にはコンポーネントのオーバーライドが1つ以上ある場合があります。これは基本的に1つのコンポーネントをキットから取り出して別のコンポーネントに置き換えることです。このスキーマは、その置換の情報を明示的にキャプチャして、ユニークなものを一緒に使用することはできません。私は、componentoverrideテーブル内のすべてのtrial_id、kit_idの組み合わせが試用テーブル内の有効な組み合わせであることを確認したいと思います。

+1

複合キーが必要と思われる理由は何ですか?通常の解決策は、代わりに 'unique_together'を使用することです – Sayse

+1

良い質問、私は説明する上記の質問を編集しました。ありがとう。 –

答えて

0

私は私の最初の移行の終わりにこれを入れてしまった:

migrations.RunSQL(""" 
      ALTER TABLE qc_trials_trial 
       ADD CONSTRAINT qc_trials_trial_unique_trial_id_kit_id 
       UNIQUE (id, kit_id); 
      ALTER TABLE qc_trials_componentoverride 
       ADD CONSTRAINT qc_trials_componentoverride_comp_constraint_trial_id_kit_id 
       FOREIGN KEY (kit_id, trial_id) 
       REFERENCES qc_trials_trial(id, kit_id) 
       DEFERRABLE INITIALLY DEFERRED 
"""), 

これは私が多くを行うために持つと予想ものだった場合、私はそれ用のカスタム操作を記述します。 https://docs.djangoproject.com/en/1.10/ref/migration-operations/#writing-your-own