1

AND我是 Django 初学者,我想出了如何动态创建模型查询,但是当我尝试混合和运算符时,我被困在某个时刻OR

我有一个字段列表(联系人姓名、公司、职位、国家/地区),这些字段可能包含多个关键字(用逗号分隔)

因此,如果我搜索这些公司名称“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)

太感谢了!

4

1 回答 1

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 将它们连接起来

希望有帮助。

于 2013-05-06T19:52:35.027 回答