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の組み合わせが試用テーブル内の有効な組み合わせであることを確認したいと思います。
複合キーが必要と思われる理由は何ですか?通常の解決策は、代わりに 'unique_together'を使用することです – Sayse
良い質問、私は説明する上記の質問を編集しました。ありがとう。 –