Queryset.objects.all()
返回所有对象,同样的,Queryset.objects.filter()
也会返回所有对象。
我有两个使用 Queryset.objects.filter()
的查询,我想使用它来返回所有对象。
问题: Queryset.objects.all()
和 Queryset.objects.filter()
的性能是否相同?
Queryset.objects.all()
返回所有对象,同样的,Queryset.objects.filter()
也会返回所有对象。
我有两个使用 Queryset.objects.filter()
的查询,我想使用它来返回所有对象。
问题: Queryset.objects.all()
和 Queryset.objects.filter()
的性能是否相同?
是的,如果不传递过滤器参数,则从数据库角度来看,两者表现相同。一旦需要检查是否传递了参数,过滤器将执行更多的处理步骤,但差异会非常小。
在这种情况下,我建议您使用 all() 而不是 filter() ,以使您的代码更清晰明了。
_chain
方法。使用filter
,您可以创建一个没有任何子级的Q
对象,但开销不大。all
仍然更可取,因为它避免了执行不必要的代码。def all(self):
"""
Return a new QuerySet that is a copy of the current one. This allows a
QuerySet to proxy for a model manager in some cases.
"""
return self._chain()
def filter(self, *args, **kwargs):
"""
Return a new QuerySet instance with the args ANDed to the existing
set.
"""
return self._filter_or_exclude(False, *args, **kwargs)
def _filter_or_exclude(self, negate, *args, **kwargs):
if args or kwargs:
assert self.query.can_filter(), \
"Cannot filter a query once a slice has been taken."
clone = self._chain()
if negate:
clone.query.add_q(~Q(*args, **kwargs))
else:
clone.query.add_q(Q(*args, **kwargs))
return clone