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

2021-11-19 21:38:20 +08:00
 zhoudaiyu
表的定义和两个查询如下 https://gist.github.com/BiTree/b0bea7b9c91e04b6a699608f527dea58
想过滤满足 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 )。求大佬解释一下。
2603 次点击
所在节点    Django
9 条回复
cz5424
2021-11-19 22:00:55 +08:00
你可以一直用 filter ,等你感觉想要查某个条件没办法查,你就可以想起 exclude 了
geebos
2021-11-19 22:05:25 +08:00
因为在 mysql 里 null 不等于 null
zhoudaiyu
2021-11-19 22:16:21 +08:00
@cz5424 这…啥意思啊大佬
@geebos 没错大佬,数据库是 mysql ,但是我看 mysql 里空外键就是 null 啊,而且 exclude 和 filter 查询外键是否为空用的都是 isnull ,但是为啥有区别呢?
izoabr
2021-11-19 23:19:11 +08:00
我是这么理解的,比如我要所有年龄 15-20 岁的朋友的对象,那我就直接 filter 大于等于 15 小于等于 20 就好了对吧,那如果这个时候有个变态需求,15-20 岁之间,并且姓赵的排除掉,是不是就可以 exclude 了。就是 filter 先查大条件把大部分先框进来,然后再个别条件排除。
izoabr
2021-11-19 23:20:34 +08:00
或者是,我就只查个不姓赵的,是不是就直接 exclude 出去了,语义上会很清晰。
geebos
2021-11-19 23:32:51 +08:00
@zhoudaiyu 不好意思看错了,不是这个问题
lululau
2021-11-19 23:36:25 +08:00
这个问题我可以理解成“为什么要搞那么多编程语言,明明用汇编几十条指令都可以搞定啊”吗
cz5424
2021-11-20 00:23:43 +08:00
把生成的 raw sql 比较一下就清楚了,这个写法有点难看出啥区别
jiayouzl
2023-01-16 18:22:26 +08:00
一个是包含,一个是不包含,这还不理解吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/816651

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX