0

モデル:

class Store(models.Model):
   name = models.CharField(max_length=100)
   greatStore = models.BooleanField()

class Book(models.Model):
   stores = models.ManyToManyField(Store)
   name = models.CharField(max_length=200,unique=True)
   fantasticBook = models.BooleanField()   

素晴らしい店にあるすべての本のリストを取得したい。ドキュメントを読むと、https ://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationshipsと書かれている:

myBooks =Book.objects.filter(stores__greatStore=True)

しかし、これは Store.greatStore==TRUE で JOIN を実行するだけで、これは私が望むものではありません!

たとえば、2 つの店舗 (どちらも優れた店舗) があり、データベースに 2 つの店舗に属する 1 つの本がある場合、myBooks には 2 つの要素 (2 倍の同じ本) があります。

(s が b.stores および s.greatStores==true に属する) を検証するカップル (b,s) の最初の要素ではなく、少なくとも 1 つの優れたストアを持つ本のコレクションが必要でした。

編集 :

Django の API が誤解を招くと思う理由: 同じ例を続けましょう: 2 つの素晴らしいストアと、両方のストアに属する本 (fantasticBook==true)。リクエストを実行すると:

myBooks = Book.objects.all()

結果は 1 つだけです。存在する唯一の本です。リクエストを実行すると:

myBooks = Book.objects.filter(coolBook=True)

結果は 1 つだけです。存在する唯一の本です。リクエストを実行すると:

myBooks = Book.objects.filter(stores__greatStore=True)

これは、少なくとも 1 つの優れたストアを持つ書籍のコレクションを取得することを意味しているように見えますが、myBooks には 2 つの結果があるため、これは得られるものではありません。

4

1 に答える 1

1

which を使用すると、次のようdistinct()なユニークな結果が得られます。Book

myBooks =Book.objects.filter(stores__greatStore=True).distinct()
于 2012-09-14T15:22:26.017 に答える