2011-07-20 90 views
0

我的模式是這樣的查詢對象:Django的 - 通過許多一對多關係

class Category(models.Model): 
    name = models.CharField(_('name'), max_length=50) 

class Product(models.Model): 
    name = models.CharField(_('product name'), max_length=40) 
    category = models.ManyToManyField(Category) 

我想建立一個過濾器查詢在那裏我可以選擇1個或多個類別,並返回連接到產品所有選定的類別。

Product_1 - 屬於category_1,category_2

Product_2 - 屬於category_1,category_2和category_3

當category_1過濾和category_2兩種產品應該由查詢返回。在所有3個類別上進行過濾時,應僅返回Product_2,因爲這是與所有選定類別相關的唯一產品。

過濾將是動態的,因此過濾的類別數量可能是無限的。

我該怎麼做?我曾嘗試過

Product.objects.filter(category__in=[1,2,3]) 

但是,由於它們與任何類別匹配,所以它們都給了我product_1和product_2。

我曾嘗試創建問答過濾

Product.objects.filter(Q(category__id=1), Q(category__id=2)) 

但這並不返回任何產品。

這樣的查詢將如何構造工作?

回答

4

我不知道這個簡單的解決方案,但也許你可以使用此解決方法:

Product.objects.filter(category__in=[1,2,3]).annotate(total=Count('category')).filter(total=3) 

或者,你可以鏈過濾器:

Product.objects.filter(category=1).filter(category=2).filter(category=3) 
+0

感謝您的答覆。如何動態鏈接過濾器? – Mikael

+0

好吧,你可以動態地添加它們在一個循環中,如:qs = qs.filter(foo = bar) – schneck

+4

您可以使用'reduce':'queryset = reduce(lambda q,c:q.filter(category = c),[1,2,3] ,Product.objects.all())' –