首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Django中动态地向查询添加筛选器?

问如何在Django中动态地向查询添加筛选器?
EN

Stack Overflow用户
提问于 2016-01-12 09:20:59
回答 7查看 18.2K关注 0票数 8

在我的viewSet中,我正在做一个查询,

代码语言:javascript
复制
queryset= Books.objects.all();

现在,通过ajax调用,我从UI中获得了筛选值,即auther.There的年龄、性别等,总共将有5个过滤器。

现在我遇到的问题是如何将过滤器添加到我的查询中(只有那些具有任何价值的过滤器)。

我尝试的是检查单个筛选值并执行查询,但这样做会失败,就好像用户删除筛选值或添加多个筛选器一样。有什么更好的建议来完成这个任务吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2016-01-12 09:30:59

这里有一个更通用的。如果将过滤器作为GET参数传递,它将应用于查询集。如果您正在执行POST调用,只需更改代码中的名称即可。

代码语言:javascript
复制
import operator
from django.db.models import Q


def your_view(self, request, *args, **kwargs):
    # Here you list all your filter names
    filter_names = ('filter_one', 'filter_two', 'another_one', )

    queryset = Books.objects.all(); 
    filter_clauses = [Q(filter=request.GET[filter])
                      for filter in filter_names
                      if request.GET.get(filter)]
    if filter_clauses:
        queryset = queryset.filter(reduce(operator.and_, filter_clauses))

    # rest of your view

请注意,可以在筛选器的名称中使用查找表达式。例如,如果希望筛选价格较低或等于在筛选器中指定的书籍,可以只使用price__lte作为筛选器名称。

票数 13
EN

Stack Overflow用户

发布于 2016-01-12 09:26:49

您还没有显示任何代码,因此您还没有真正解释问题的所在:

从queryset Book.objects.all()开始。对于每个过滤器,检查request.POST中是否存在过滤器的值,如果存在,则筛选查询集。Django queryset是惰性的,因此只有最后的queryset才会被计算。

代码语言:javascript
复制
queryset = Book.objects.all()
if request.POST.get('age'):
    queryset = queryset.filter(author__age=request.POST['age'])
if request.POST.get('gender'):
    queryset = queryset.filter(author__gender=request.POST['gender'])
...
票数 10
EN

Stack Overflow用户

发布于 2017-05-14 06:48:18

您只需将request.GET内容作为dict (确保将值转换为string或所需的类型,因为默认情况下它们将是列表),即:dict(request.GET)将给您提供类似于{u'a': [u'val']}的内容。

一旦确定您有匹配模型字段的键字典,您可以简单地这样做:

filtered = queryset.filter(**dict_container)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34739680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档