Django 动态组合Q()-或对象

Django 动态组合Q()-或对象,django,django-queryset,django-q,Django,Django Queryset,Django Q,我正在尝试在这个列表视图中创建一个动态搜索。我的想法是在每次尝试继承此视图时指定字段和搜索类型 我的问题是,每次我尝试进行搜索时,它只对元组的第一个字段有效。在我的示例中:requests\u email是第一个字段,当我在查询“app”后打印对象query\u q时,我得到以下输出: (OR: (AND: ), ('requests__email__icontains', 'app'), (AND: ('requests__email__icontains', 'app'), ('status

我正在尝试在这个列表视图中创建一个动态搜索。我的想法是在每次尝试继承此视图时指定字段和搜索类型

我的问题是,每次我尝试进行搜索时,它只对元组的第一个字段有效。在我的示例中:
requests\u email
是第一个字段,当我在查询“app”后打印对象
query\u q
时,我得到以下输出:

(OR: (AND: ), ('requests__email__icontains', 'app'), (AND: ('requests__email__icontains', 'app'), ('status__icontains', 'app')), (AND: ('requests__email__icontains', 'app'), ('status__icontains', 'app'), ('license_type__name__icontains', 'app')))
我不明白为什么,因为我在使用操作符,我以为它在
query\u q\124;=q(**query\u kwargs)
中会起作用。如果我尝试基于其他属性进行搜索,例如,
status
,则搜索不起作用

views.py
如果您想将查询构建为X=Y或W=Z,那是因为

query_kwargs["{0}__{1}".format(field, search_type)] = term
在循环的每次迭代中,您将向
query\u kwargs
添加更多的键,而不是重新创建变量 我建议这样做

for field, search_type in self.searchable_fields:
    query_q |= Q(**{"{0}__{1}".format(field, search_type): term})

啊啊。非常正确。我完全没有注意到这一点。谢谢你的提醒。:)
for field, search_type in self.searchable_fields:
    query_q |= Q(**{"{0}__{1}".format(field, search_type): term})