如何在Django查询中混合使用AND和OR运算符?

时间:2013-05-06 17:21:58

标签: python django django-views

我是一名Django初学者,我想出了如何动态创建模型查询,但是当我想要混合ANDOR运算符时,我陷入了困境:

我有一个字段列表(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 个答案:

答案 0 :(得分: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代替多个OR
  • 为每个搜索字段收集这些in个查询,然后使用AND
  • 加入它们

希望有所帮助。