Django中Queryset.objects.all()与无参filter()的性能是否一致?
QuerySet.objects.all()与无参数QuerySet.objects.filter()的性能对比 嘿,这个问题问得挺到位的!在Django里,这两种写法在性能表现上完全没有区别,具体原因可以拆成这几点来看:
生成的SQL完全一致:你可以自己动手验证——把两个QuerySet的
query属性打印出来,比如print(YourModel.objects.all().query)和print(YourModel.objects.filter().query),输出的SQL语句是一模一样的,都是查询表中全部数据的语句(类似SELECT * FROM your_app_yourmodel;)。Django处理无参数filter()时,内部就是创建了一个空筛选条件,和all()的底层逻辑最终指向同一种查询。QuerySet的惰性执行特性:不管是
all()还是无参数filter(),返回的都是未触发数据库查询的QuerySet对象——只有当你开始迭代这个QuerySet、调用list()转成列表,或者执行count()这类需要数据库返回结果的操作时,才会真正执行SQL。所以在构建QuerySet的阶段,两者没有任何性能开销差异。后续链式操作表现一致:如果之后要给这个QuerySet追加筛选、排序等操作(比如
.filter(status='active').order_by('-created_at')),两种写法的表现完全相同,因为它们返回的都是标准的QuerySet实例,没有任何隐藏差异。
不过有个小建议:从代码可读性角度来说,all()的语义更明确,一看就知道是要获取所有对象;而无参数的filter()容易让其他开发者疑惑“是不是漏写筛选条件了?”。所以如果你的意图就是获取全量数据,优先用all()会让代码更易维护。
内容的提问来源于stack exchange,提问作者Hadi Farhadi

