Django自定义ModelManager中get_queryset如何按条件追加AND过滤
核心原因
Django 的 QuerySet 是不可变对象,每次调用 filter() 方法都会返回一个全新的 QuerySet 实例,不会修改原有变量指向的查询对象。你原有写法中调用 qs.filter() 后没有重新赋值给 qs,追加的过滤条件自然不会生效。
修正代码
class MyCustomManager(models.Manager): def doFoo(self, user, s_format): qs = super().get_queryset().filter(created_by=user) if <condition 1>: # 将过滤后的新查询集回写给qs变量 qs = qs.filter(mode='A') elif <condition 2>: qs = qs.filter(mode='B') return qs
上述写法的最终查询逻辑和链式调用 filter(created_by=user, mode='A') 完全等价,多个过滤条件会自动用 AND 拼接。
扩展说明
- 如果需要叠加多个非互斥的过滤条件,把
elif替换为if即可,多个分支的过滤规则会依次叠加 - 该写法也支持更复杂的动态查询场景,比如循环拼接过滤条件、动态传入Q对象组合逻辑等
内容的提问来源于stack exchange,提问作者asprin
相关产品推荐
相关产品推荐

