如何在Django中动态地向查询添加过滤器?
作者:互联网
在我的viewSet中,我正在进行查询,
queryset= Books.objects.all();
现在从ajax调用我从UI获得我的过滤器值,即auther的年龄,性别等.总共将有5个过滤器.
现在我遇到的问题是如何向查询添加过滤器(只有那些具有任何值的过滤器).
我尝试的是我检查了单个过滤器值并进行了查询,但这样就失败了,就像用户删除过滤器值或添加多个过滤器一样.
任何更好的建议如何实现这一目标?
解决方法:
这是一个更通用的.如果它们作为GET参数传递,它将对您的查询集应用过滤器.如果您正在进行POST调用,只需更改代码中的名称即可.
import operator
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作为过滤器名称.
标签:python,django,django-orm 来源: https://codeday.me/bug/20190712/1437781.html