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

Django QuerySet中先调用exclude()还是values()性能更优?

Django QuerySet:exclude()与values()的调用顺序分析

两种写法都是合法的,最终效果和性能完全相同。

核心原因是Django的QuerySet采用惰性求值机制——链式调用的各个方法只是在逐步构建SQL查询语句,并不会立即触发数据库查询。不管你先调用exclude()还是values(),Django最终生成的SQL都会遵循「先通过过滤条件筛选数据,再选择指定字段」的逻辑:

以你的示例为例,两种写法生成的SQL完全一致,类似:

SELECT testmodel.* FROM testmodel WHERE NOT (testmodel.somefield = 'somevalue');

哪怕你给values()指定具体字段(比如values('id', 'title')),两种写法的SQL依然没有区别:先执行exclude()的过滤条件,再选择你指定的字段,不会出现「先查询全量字段再在内存中过滤」的情况。

总结

  • 两种写法都正确,没有语法或逻辑错误
  • 生成的SQL完全相同,性能不存在差异
  • 选择哪种写法仅取决于个人代码习惯,比如更倾向先写过滤逻辑还是字段选择逻辑

内容的提问来源于stack exchange,提问作者sudhanva shankara.m

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:53:11