包含列表中所有值的 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
操作,因此如果值在1
或2
或3
或4
或5
中,它会选择对象.
有没有一种简单的方法来运行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 反向查询集的主要内容,如果未能解决你的问题,请参考以下文章