0

我有一个像这样的 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
4

2 回答 2

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)

或者operator.or_像@rinti 提到的那样使用。

于 2014-07-17T09:30:04.823 回答
0

导入operator然后你可以这样做:

params = []

# Add as much as you like to your list dynamically
params.append(Q(something))

Model.objects.filter(reduce(operator.or_, params))
于 2014-07-17T09:28:03.793 回答