使用 Django 表单进行动态搜索
dynamic search with django form
我想使用 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 中有没有好的方法来做到这一点?
您可以使用内置运算符中的 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]))
不确定 Django 特定的,但您可以使用 eval
。
N.B:如果您使用用户输入并且可能会带来各种不安全因素,那么这是一个坏主意。 - 但如果你完全控制它应该没问题。
x = []
for search_field in search_fields:
x.append(eval("qs.filter(Q({}__contains={})".format(search_field, search_text))
为了方便,我存储在 list
中。如果您被允许在 Django
查询中使用 |
运算符 - 我不知道我可以,您可以将它分配给一个变量。
我想使用 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 中有没有好的方法来做到这一点?
您可以使用内置运算符中的 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]))
不确定 Django 特定的,但您可以使用 eval
。
N.B:如果您使用用户输入并且可能会带来各种不安全因素,那么这是一个坏主意。 - 但如果你完全控制它应该没问题。
x = []
for search_field in search_fields:
x.append(eval("qs.filter(Q({}__contains={})".format(search_field, search_text))
为了方便,我存储在 list
中。如果您被允许在 Django
查询中使用 |
运算符 - 我不知道我可以,您可以将它分配给一个变量。