我是一名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)
万分感谢!
答案 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 希望有所帮助。