使用django,我想在多个字段中动态搜索文本。我有一个要搜索的字段列表以及要搜索的文本。我还有一个初始查询集来查询。这些方面的东西:
def dynamic_search(queryset):
search_fields = ["search_field1", "search_field2", "search_field3"]
search_text = "dummy_text"
# I want to dynamically generate this query
qs.filter(Q(search_field1__contains=search_text) | Q(search_field2__contains=search_text) | Q(search_field3__contains=search_text))
问题是search_fields
是一个通用列表,所以我也需要动态查询这些字段。在django有一个很好的方法吗?
答案 0 :(得分:1)
您可以使用运算符builtins中的or_方法,列表推导和reduce内置,如下所示:
from django.db.models import Q
import operator
def dynamic_search(queryset):
search_fields = ["search_field1", "search_field2", "search_field3"]
search_text = "dummy_text"
queryset.filter(reduce(operator.or_, [Q(**{'{0}__contains'.format(search_field): search_text}) for search_field in search_fields]))
答案 1 :(得分:0)
不确定Django特定的一个,但您可以使用eval
。
x = []
for search_field in search_fields:
x.append(eval("qs.filter(Q({}__contains={})".format(search_field, search_text))
我为了方便而存储在list
中。如果您允许在|
查询中使用Django
运算符 - 我不知道您可以,您可以将其分配给变量。