V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhoudaiyu
V2EX  ›  Django

Django 的 ORM 的 exclude 和 filter 的区别到底是啥?

  •  
  •   zhoudaiyu · 2021-11-19 21:38:20 +08:00 · 2382 次点击
    这是一个创建于 860 天前的主题,其中的信息可能已经有所发展或是发生改变。
    表的定义和两个查询如下
    想过滤满足 A 表中 age 大于等于 13 的,且关联 B 表的,且关联的 B 表中记录的 is_admin 为真的所有 A 表记录,为啥上面的 queryset 啥都查不出来,但是下面的能查出来呢?看了官网感觉 filter 和 exclude 没啥区别啊,都是过滤出想要的东西,就是 select foo from bar where xxx=yyy ( filter ),select foo from bar where xxx!=yyy ( exclude )。求大佬解释一下。
    9 条回复    2023-01-16 18:22:26 +08:00
    cz5424
        1
    cz5424  
       2021-11-19 22:00:55 +08:00 via iPhone
    你可以一直用 filter ,等你感觉想要查某个条件没办法查,你就可以想起 exclude 了
    geebos
        2
    geebos  
       2021-11-19 22:05:25 +08:00
    因为在 mysql 里 null 不等于 null
    zhoudaiyu
        3
    zhoudaiyu  
    OP
       2021-11-19 22:16:21 +08:00 via iPhone
    @cz5424 这…啥意思啊大佬
    @geebos 没错大佬,数据库是 mysql ,但是我看 mysql 里空外键就是 null 啊,而且 exclude 和 filter 查询外键是否为空用的都是 isnull ,但是为啥有区别呢?
    izoabr
        4
    izoabr  
       2021-11-19 23:19:11 +08:00
    我是这么理解的,比如我要所有年龄 15-20 岁的朋友的对象,那我就直接 filter 大于等于 15 小于等于 20 就好了对吧,那如果这个时候有个变态需求,15-20 岁之间,并且姓赵的排除掉,是不是就可以 exclude 了。就是 filter 先查大条件把大部分先框进来,然后再个别条件排除。
    izoabr
        5
    izoabr  
       2021-11-19 23:20:34 +08:00
    或者是,我就只查个不姓赵的,是不是就直接 exclude 出去了,语义上会很清晰。
    geebos
        6
    geebos  
       2021-11-19 23:32:51 +08:00
    @zhoudaiyu 不好意思看错了,不是这个问题
    lululau
        7
    lululau  
       2021-11-19 23:36:25 +08:00 via iPhone
    这个问题我可以理解成“为什么要搞那么多编程语言,明明用汇编几十条指令都可以搞定啊”吗
    cz5424
        8
    cz5424  
       2021-11-20 00:23:43 +08:00 via iPhone
    把生成的 raw sql 比较一下就清楚了,这个写法有点难看出啥区别
    jiayouzl
        9
    jiayouzl  
       2023-01-16 18:22:26 +08:00
    一个是包含,一个是不包含,这还不理解吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1649 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 16:47 · PVG 00:47 · LAX 09:47 · JFK 12:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.