Django中的动态过滤器

时间:2017-11-08 14:39:42

标签: python django

在我的应用中,我有一张表格。根据表单,用户可以配置一个或多个过滤器。

在我看来,我有例证:

query = Test.objects.filter(filter1 = request.post['filter1'], filter2 = request.post['filter2'], filter3 = request.post['filter3'])

因此,有时filter1,filter2或filter3可能不存在。

如果没有任何过滤器,我只想忽略过滤器。

我可以用很多“IF”条件做一个脚本,但可能有一个聪明的解决方案吗?

感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

您可以采取以下措施:

filters = {}

for key, value in request.post.items():
    if key in ['filter1', 'filter2', 'filter3']:
        filters[key] = value

Test.objects.filter(**filters)

其中列表是您打算按

过滤的键列表

修改

正如Thomas Junk建议你可以通过理解让它变得更清晰:

filters = {
    key: value
    for key, value in request.post.items()
    if key in ['filter1', 'filter2', 'filter3']
}

Test.objects.filter(**filters)

答案 1 :(得分:0)

此代码解决了我的问题:

if request.method == 'GET':
        filters = {}
        for key, value in request.GET.items():
            if value != '':
                filters[key] = value
        filter_list=Pet.objects.filter(**filters)

答案 2 :(得分:0)

你可以使用这样的东西:

loop{loop{}}

在这个例子中:

import ast def query_to_dict(query) -> dict: filters = {} for field, value in query.items(): # <- param and value like ?param1=True filters[field] = ast.literal_eval(str(value)) # <- parse list/str/bool return filters def event_view(request): events = Event.objects.filter( Q(**query_to_dict(request.GET)) ) return Response( EventsSerializer(events, many=True).data ) - 帮助解析 bool 值和列表的模块

ast - 这是您的查询参数 request.GET。确保以 ?param1=True&param2="[1, 2]" 之类的方式传递参数 - 使用双引号

?title="hello" - 将查询参数转换为 python dict 的函数。因此您可以将此 dict 传递给您的 query_to_dict

以这种方式使用过滤的好处,您可以传递 Event.objects.filter 这样的东西,它会起作用。我不能肯定它是否安全,但对于一些复杂的过滤或布尔字段过滤它是完美的。