You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:06:05