2011-07-20 13 views
0

私のモデルは次のようになり、多対多の関係を経由して照会オブジェクト:私は、私は1つのまたは多数のカテゴリを選択することができ、フィルタクエリを作成し、に接続されている製品を返品しようとしていますジャンゴ -

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) 

すべての選択されたカテゴリ。

Product_1は - category_1に属し、category_2

Product_2は - category_1とcategory_2両方の製品のフィルタリングは、クエリによって返されるべき場合category_2とcategory_3

、category_1に属します。 3つすべてのカテゴリをフィルタリングする場合、これは選択したすべてのカテゴリに関連する唯一の製品であるため、Product_2のみが返されます。

フィルタリングは動的なので、フィルタリングするカテゴリの数は無限になります。

どうすればよいですか?私はやってみた

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

しかし、それは私がproduct_1とproduct_2の両方を与えるのは、カテゴリのいずれかと一致するからです。

私はQフィルタ

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()) ' –