Django - 通过多对多关系查询对象

时间:2011-07-20 12:42:05

标签: django filter many-to-many

我的模特看起来像这样:

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_3

对category_1和category_2进行过滤时,查询应返回两个产品。过滤所有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))

但这不会返回任何产品。

如何构建这样的查询才能工作?

1 个答案:

答案 0 :(得分: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)