2017-05-22 5 views
1

私は、セットのすべてのメンバー間の対の関係をモデル化したいと思います。私はペアA-Bを追加するとDjango undirected unique-together

class Match(models.Model): 

    foo_a = models.ForeignKey(Foo, related_name='foo_a') 
    foo_b = models.ForeignKey(Foo, related_name='foo_b') 

    relation_value = models.IntegerField(default=0) 

    class Meta: 
     unique_together = ('ingredient_a', 'ingredient_b') 

、それが成功し、再び-Bを追加することから私を防ぎますが、B-Aを追加してから私を防ぐことはできません。

私は次のように試みましたが、役に立たないです。

unique_together = (('ingredient_a', 'ingredient_b'), ('ingredient_b', 'ingredient_a')) 

編集: は、私はあなたが、そのだけではなくのForeignKey、その呼ばれる多対多の関係を定義した何のようなモデルを定義した場合の項目

答えて

1

を参照してください。毎回2ペアを保存するオブジェクト。ユーザがペアA-Bを追加したい場合、同じパラメータを有するレコードB-Aが自動的に追加される。

注:この解決策は、クエリの速度に影響します。私のプロジェクトでは問題ではありませんが、考慮する必要があります。

def save(self, *args, **kwargs): 
    if not Match.objects.filter(foo_a=self.foo_a, foo_b=self.foo_b).exists(): 
     super(Match, self).save(*args, **kwargs) 
    if not Match.objects.filter(foo_a=self.foo_b, foo_b=self.foo_a).exists(): 
     Match.objects.create(foo_a=self.foo_b, foo_b=self.foo_a, bar=self.bar) 

EDIT:更新と削除の方法はあまりにも当然上書きする必要があります。

1

のすべてのペアのために一意であるrelationship_valueを必要としています。

djangoドキュメントでは、ManyToMany関係に一意のtogether制約を含めることはできないことが明示的に定義されています。

ドキュメントから、

AのManyToManyFieldはunique_togetherに含めることはできません。 (それが何を意味するのかははっきりしません)ManyToManyFieldに関連する一意性を検証する必要がある場合は、シグナルまたは明示的なモデルを使用してみてください。

EDIT

検索し、いくつかの試行錯誤をたくさんした後、最終的に私は私があなたのシナリオのためのソリューションを見つけたと思います。はい、あなたが言ったように、現在のスキーマは、私たちみんなが思っているほど些細なものではありません。この文脈では、多対多の関係は、私たちが必要とする議論ではありません。解決策は、(または私は解決策は、と思われるもの)モデルきれいな方法:モデル清潔方法の詳細については

class Match(models.Model): 
    foo_a = models.ForeignKey(Foo, related_name='foo_a') 
    foo_b = models.ForeignKey(Foo, related_name='foo_b') 

    def clean(self): 
     a_to_b = Foo.objects.filter(foo_a = self.foo_a, foo_b = self.foo_b) 
     b_to_a = Foo.objects.filter(foo_a = self.foo_b, foo_b = self.foo_a) 

     if a_to_b.exists() or b_to_a.exists(): 
      raise ValidationError({'Exception':'Error_Message')}) 

は、私がの保存メソッドをオーバーライドしてきましたdocs here...

+0

私は指定された2つのアイテムごとにrelationship_valueを一意にします。これは、ManyToManyの関係を一度に1つのアイテムに制限する必要があることを意味します。これは私が知る限り、自明ではありません。 –

+0

あなたの編集は矛盾を防ぎます。入力いただきありがとうございます。冗長ペアA-B、B-Aを作成して解決しました。このテーブルはプロダクションクエリには使用されませんが、将来の使用のために混乱マトリクスを作成するだけなので、パフォーマンスは問題になりません。 パフォーマンスを考慮する必要がある場合は、どちらの方が良いか疑問に思っています。あなたのアプローチには、更新と削除のメソッドをオーバーライドする必要がないという利点があります。 –

+0

うれしい、私はいくつかの助けになるかもしれない... – zaidfazil

関連する問題