2012-09-14 79 views
0

型號:多對多不清楚在Django

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 JOIN == TRUE這不是我想要的!

例如,如果我有兩個商店(都是很好的商店)和一本屬於我店數據庫的書,myBooks將有兩個元素:同一本書的兩倍。

我想要的書,其至少有一個很大的店,不是夫妻(B,S)驗證第一元素(屬於b.stores和s.greatStores ==真)

集合編輯:

爲什麼我認爲Django的API是誤導性的: 讓我們保持同樣的例子:2商店和book(夢幻般的書==真)屬於這兩個商店。 如果運行要求:

myBooks = Book.objects.all() 

你得到結果只有一個:存在的唯一的書。 如果運行要求:

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

你得到結果只有一個:存在的唯一的書。 如果運行要求:

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

這似乎意味着你得到的書籍,至少有一個偉大的店集合,但是這不是我們所得到的,因爲myBooks有2個結果。

+0

所以,你要的書是在結果集特有的? – XORcist

+0

我想收藏的書至少有一個偉大的商店,所以是獨一無二的。 – JohnCastle

回答

1

您可以使用distinct()這將給你獨一無二的結果Book這樣的:

myBooks =Book.objects.filter(stores__greatStore=True).distinct() 
+0

好吧,似乎是它,它只是至少對我來說不清楚的文檔。 – JohnCastle