2013-05-06 121 views
1

我一个Django初学者,我想出如何动态地创建一个模型查询,但我被困在某些时候,当我特林混合ANDOR运营商:如何在Django查询中混合使用AND和OR运算符?

我的字段列表(CONTACT_NAME,公司,职位,国家),这些字段可能包含多个关键字(以逗号分隔,'')

因此,如果我搜索这些公司名称“imtech,ABC,FooBar”,我会得到正确的结果我有下面,因为它总是使用|(OR)运算符。

但是,如果我想限制搜索公司字段的条目为“imtech,ABC,FooBar”,并且只将位置字段设置为“客户经理”,该怎么办?

我知道我必须将&运算符放在每个字段循环的末尾,但我还没有成功完成,所以这里是我的代码,请帮助我!

search_fields = {'contact_name', 'company', 'position', 'country'} 
search_fields_values = {} 
qs_params = None 

for field in search_fields: 
    search_fields_values[field] = self.request.GET.get(field, None) 
    if search_fields_values[field]: 
     search_fields_values[field] = search_fields_values[field].split(',') 

     for part in search_fields_values[field]: 
      q = Q(**{field: part}) 
      qs_params = qs_params | q if qs_params else q 

qs = qs.filter(qs_params) 

非常感谢!

回答

1

我希望我能正确理解你的问题。

这里是在理论上应该工作(没有测试它虽然):

import operator 

... 

search_fields = {'contact_name', 'company', 'position', 'country'} 

conditions = [] 
for name in search_fields: 
    value = self.request.GET.get(name, None) 
    if value: 
     conditions.append(Q(**{name + "__in": value.split(',')})) 

qs = qs.filter(reduce(operator.and_, conditions)) 

所以,两种想法进入了我的脑海:

  • 使用__in而不是几个手术室
  • 为每个搜索字段收集这些in查询,然后将它们与AND连接起来

希望有所帮助。

+0

你是我的男人alecxe!非常感谢,这正是我所期待的。 – Oms 2013-05-06 21:15:13