我的模特看起来像这样:
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))
但这不会返回任何产品。
如何构建这样的查询才能工作?
答案 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)