使用django形式进行动态搜索

时间:2015-06-03 14:43:35

标签: python django forms dynamicquery

使用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有一个很好的方法吗?

2 个答案:

答案 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

N.B:如果您使用用户输入并且可能会打开所有不良行为,这是一个不好的想法。 - 但是如果你完全控制它应该没问题。

x = []
for search_field in search_fields:
    x.append(eval("qs.filter(Q({}__contains={})".format(search_field, search_text))

我为了方便而存储在list中。如果您允许在|查询中使用Django运算符 - 我不知道您可以,您可以将其分配给变量。