【问题标题】:manipulating Q objects, Adding new condition dynamically操作 Q 对象,动态添加新条件
【发布时间】:2014-09-08 02:10:10
【问题描述】:

我有一个像这样的 Q 对象。

params = Q(salt_spray__iregex=keyword) | Q(special_function__iregex=keyword) | Q(comment__iregex=keyword)

当我在此基础上过滤我的模型时,一切正常。

Model.objects.filter(params)

但我想做以下事情。

params = Q(salt_spray__iregex=keyword) | Q(special_function__iregex=keyword) | Q(comment__iregex=keyword)
if data.get('market'):
    params[project__market] = data['market'] # not sure about this step. 
Model.objects.filter(params)

解决方案后的代码

数据 = self.cleaned_data

keyword = data['keyword']
params = Q()
if keyword:
    params |= Q(salt_spray__iregex=keyword) | Q(special_function__iregex=keyword) | Q(comment__iregex=keyword) # Note OR Operator. 

if data['market']:
    params &= Q(project__market=data['market']) # Note here AND Operator 
innovations = Innovation.objects.filter(params)
return innovations

【问题讨论】:

    标签: python django django-orm django-q


    【解决方案1】:

    您需要使用| 运算符 Q 对象:

    params = Q(salt_spray__iregex=keyword) | Q(special_function__iregex=keyword) | Q(comment__iregex=keyword)
    if data.get('market'):
        params |= Q(project__market=data['market'])
    Model.objects.filter(params)
    

    或者使用@rinti 提到的operator.or_

    【讨论】:

    • 优秀的解决方案。您可以相应地组合 AND 或 OR 运算符。
    • @Jack,在组合 ANDOR 运算符时要注意。如果您想 AND 2 组查询,您需要为 AND 执行 &= <the other group 而不是单个 &=,然后为其他组执行 |=元素。
    • 你的意思是&=< ?? <有什么用?
    • @Jack,对不起,我错过了结束> - 它应该是&= <the other group>
    • 完美,你能看到我上面的更新代码并看到它正确吗?
    【解决方案2】:

    import operator 然后你可以这样做:

    params = []
    
    # Add as much as you like to your list dynamically
    params.append(Q(something))
    
    Model.objects.filter(reduce(operator.or_, params))
    

    【讨论】:

      猜你喜欢
      • 2014-06-06
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多