django使用Q对象构建查询集

发布于 2021-01-29 14:56:08

我有一个表格,可以让您选择多种项目类型进行过滤。例如,假设您的项目类型为“研究”,“培训”和“评估”。

基本上我想做的是使用Q对象构建查询集,例如:

projects.filter(Q(type__type="Research") | Q(type__type="Training"))

我只是不确定如何在没有filter()输入为字符串的情况下构建此字符串,这会产生错误:

querystring = ""
for t in types:
    querystring += " | Q(type__type="+t+")"
projects.filter(querystring) ## produces error: "ValueError: too many values to unpack"

那么,如何遍历类型以创建带有Q对象的查询集的方法呢?

关注者
0
被浏览
72
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您只是在构建与实际Q()查询对象没有任何关系的字符串。从第一个Q()实例开始并添加更多:

    query = Q(type__type=types[0])
    for t in types[1:]:
        query |= Q(type__type=t)
    projects.filter(query)
    

    您也可以使用该functools.reduce()函数执行此操作:

    from functools import reduce
    from operator import or_
    
    query = reduce(or_, (Q(type__type=t) for t in types))
    projects.filter(query)
    

    reduce()调用与上述for循环完全相同。采取一系列Q(..)对象并将它们组合成一个更大的查询,其中所有部分都与|或操作结合在一起。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看