【问题标题】:Django reverse queryset containing all values in list包含列表中所有值的 Django 反向查询集
【发布时间】: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 对象。

非常感谢任何帮助!

【问题讨论】:

    标签: django sqlite python-2.7 django-models django-queryset


    【解决方案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 个查询。 (请参阅我的回答中的评论,该评论是在您上面的评论之前发表的。)我五岁的孩子需要我的注意,所以我匆忙删除了我之前的评论,主要是为了承认你的评论。我只是想不出我儿子在我身边吵着要关注我该说什么。干杯。
    猜你喜欢
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    相关资源
    最近更新 更多