从多个表单域中搜索数据库

时间:2018-04-06 05:29:02

标签: django forms

我有以下情况。我有一个包含3个字段的表单,使用POST方法提交。然后捕获字段并在数据库上使用Q进行搜索:

query = Model.objects.filter( Q(field1=field1) & Q(field2=field2) & Q(field3=field3))

问题在于我想动态使用填充的字段而不是空字段。这意味着查询将包含一个或两个或三个标准,具体取决于用户。

我已设法执行我用嵌套if描述的搜索,但考虑添加额外的字段,它会变得越来越大。

谢谢

2 个答案:

答案 0 :(得分:0)

您可以编写通用函数,以根据传入的字段生成查询。

def generate_query(**kwargs):
    query = Q()
    for database_field, value in kwargs.items():
        query_dict = {database_field:value} 
        if value:
            query &= Q(**query_dict)
    return query

并使用它:

data = {"name":"john", "age__gte":25} # your post data
query = generate_query(**data)
objects = SomeModel.objects.filter(query)
# generally: SomeModel.objects.filter(request.POST)

答案 1 :(得分:0)

考虑您有如下的查询字段:

field = {'field1': 'value1', 'field2': 'value2', 'field3': None}

您可以过滤以删除空字段,如下所示:

non_empty_field = dict(filter(lambda x: x[1], field.items()))  # output: {'field1': 'value1', 'field2': 'value2'}

对于执行和查询,您可以写

Model.objects.filter(**non_empty_field)  # equivalent to Model.objects.filter(field1='value1', field2='value2')

执行和查询您不需要Q()对象

对于执行或查询,您可以写:

Model.objects.filter(eval('|'.join(['(Q({}="{}"))'.format(i,j) for i,j in non_empty_field.items()])))  

根据上面的field示例,查询将等同于:

Model.objects.filter(Q(field1=value1) | Q(field2=value2))