包含列表中所有值的 Django 反向查询集

Posted

技术标签:

【中文标题】包含列表中所有值的 Django 反向查询集【英文标题】:Django reverse queryset containing all values in list 【发布时间】:2015-01-28 21:41:48 【问题描述】:

如果我有:

value_list = [1, 2, 3, 4, 5]

现在我正在表演:

Category.objects.filter(title__values__in=value_list)

但是,Category 过滤器在值列表上运行OR 操作,因此如果值在12345 中,它会选择对象.

有没有一种简单的方法来运行AND 操作,所以它会选择包含value_list 中所有元素的所有Category 对象?

例如)选择所有Categories,其中values等于1 AND 2 AND 3 AND 4 AND 5。 (为了澄清,这意味着单个value 等于1,单个value 等于2 等等......)

注意:我们在这里运行双重反向查找,首先查找title 对象,然后查找value 对象。

非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

是的,您有用于此目的的复杂查找的 Q 对象

from django.db.models import Q

qs = Category.objects.filter(reduce(operator.and_, (Q(title__values=x) for x in value_list))

这相当于说(本质上更冗长的说法是):

query = None
for x in values_list:
    if not query:
        query = Q(title__values=x)
    else:
        query &= Q(title__values=x)

qs = Category.objects.filter(query)

Q objects here 上的文档

【讨论】:

向我竖起大拇指,寻求另一种选择。但是哇,Django 在这里真的把事情复杂化了。 (不过不要误会我的意思。我喜欢 Django!) 我同意.. 但是,忽略冗长的代码,这将评估为 1 个查询,因为评估是惰性的.. @JustinBarber 实际上,在您的解决方案中,它也只是对数据库的 1 次查询.. 感谢您的评论。我知道我的数据库也只有 1 个查询。 (请参阅我的回答中的评论,该评论是在您上面的评论之前发表的。)我五岁的孩子需要我的注意,所以我匆忙删除了我之前的评论,主要是为了承认你的评论。我只是想不出我儿子在我身边吵着要关注我该说什么。干杯。

以上是关于包含列表中所有值的 Django 反向查询集的主要内容,如果未能解决你的问题,请参考以下文章

合并或联合动态创建的查询集列表 - Django

在Django中通过反向存在检查过滤查询集

Django查询以获取关键字集包含在搜索字符串中的所有广告

Django反向过滤查询集外键示例不起作用

如何通过django中的多级反向外键获取相关对象查询集?

Django 按顺序连接两个查询集