Django双参数过滤适配咨询:实现单/双条件兼容过滤
解决Django双参数过滤的动态条件问题
这个问题我之前也碰到过,原来的写法会因为空的__in条件导致无数据返回——当其中一个参数没被选择时,getlist()会返回空列表,Q(category__in=[])这种条件会直接排除所有数据,两个条件用&连接后自然就没结果了。咱们可以通过动态构建查询条件来实现单条件/双条件都能正常过滤的需求:
def get_queryset(self): # 初始化一个空的查询条件 query = Q() # 获取category参数列表,非空时添加过滤条件 categories = self.request.GET.getlist("category") if categories: query &= Q(category__in=categories) # 获取brand参数列表,非空时添加过滤条件 brands = self.request.GET.getlist("brand") if brands: query &= Q(brand__in=brands) # 应用最终的查询条件 queryset = Product.objects.filter(query) return queryset
代码说明:
- 一开始创建一个空的
Q()对象,作为查询的基础 - 分别检查
category和brand的参数:只有当参数列表不为空时,才将对应的过滤条件追加到查询中 - 如果两个参数都有值,就自动实现双条件的与过滤;如果只有一个参数有值,就只按该条件过滤;如果都没选,会返回所有
Product数据(如果需要默认返回空,可以在最后加判断,但通常这种场景默认返回全量更合理)
内容的提问来源于stack exchange,提问作者Kmssr
相关产品推荐
相关产品推荐

