This question already has answers here:
Django filter queryset __in for *every* item in list

(8 个回答)


4年前关闭。




我有一个带有 ManyToMany 字段的 CartItem 模型到一个 AttributeChoice 模型。因此,例如 CartItem 可以有 AttributeChoice "Small"和 "Red"。

然后我想找到我的 CartItem ,它们都具有“小”和“红色”属性。如果我执行以下操作:
CartItem.objects.get(cart=cart, product=product, attribute__in=attribute_list)

其中 attribute_list 是“Small”和“Red”的 AttributeChoice 对象列表。然后我也会得到只有“小”或“红色”的对象,但不是两者都有。

所以这个查询将匹配:
  • 购物车项目 A,小号,红色
  • CartItem B, 小号
  • CartItem C, 红色

  • 虽然我想要的是一个只匹配 CartItem A 的查询。

    现在...我可以创建很多 AND 语句,但我需要一个灵活的解决方案,可以包含 1 或 100 个要过滤的属性。因此,将对象列表传递给它会很棒。

    想法?

    最佳答案

    此问题的解决方案已发布在 this thread 中。

    这就是我编写查询的方式:

    CartItem.objects.filter(cart=cart, product=product, attribute__in=attribute_list).annotate(num_attr=Count('attribute')).filter(num_attr=len(attribute_list))
    

    关于python - Django 过滤器,其中 ManyToMany 字段包含所有列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32963210/

    10-09 15:55