使用 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 查询中使用 | 运算符 - 我不知道我可以,您可以将它分配给一个变量。