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
相关产品推荐
相关产品推荐

