Queryset.objects.all()
返回所有对象,
Queryset.objects.filter()
也返回所有对象。
我有两个使用Queryset.objects.filter()
的查询,我想将其用于返回所有对象。
问题:Queryset.objects.all()
和Queryset.objects.filter()
性能相同?
是的,一旦您不传递过滤器上的任何参数,两者都会在数据库的角度执行相同的操作。过滤器将执行更多的处理步骤,一旦需要检查您是否通过了参数,但区别将很少。
在这种情况下,我想您应该使用all((而不是过滤器,只是为了使您的代码更清楚您在做什么。
在下面的django的源代码中,几乎相同。两种方法都调用_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