【问题标题】:django Building a queryset with Q objectsdjango 使用 Q 对象构建查询集
【发布时间】:2013-12-11 21:55:39
【问题描述】:

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

基本上我想做的是使用 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 对象的查询集?

【问题讨论】:

    标签: python django django-queryset django-q


    【解决方案1】:

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

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

    您也可以使用functools.reduce() function 来执行此操作:

    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(..) 对象并将它们组合成一个更大的查询,其中所有部分与| 或操作组合。

    【讨论】:

      猜你喜欢
      • 2014-02-06
      • 2015-07-15
      • 2021-09-15
      • 2015-06-23
      • 2013-02-27
      • 2015-08-19
      • 2015-05-13
      • 2010-12-27
      相关资源
      最近更新 更多