Queryset.objects.all()
返回所有对象,
Queryset.objects.filter()
也会返回所有对象。
我有两个使用Queryset.objects.filter()
的查询,我想用它来返回所有对象。
问题:Queryset.objects.all()
和Queryset.objects.filter()
效果是否相同?
答案 0 :(得分:7)
是的,一旦您没有在过滤器上传递任何参数,两者都将在数据库的角度执行相同的操作。一旦需要检查你是否传递了参数,过滤器将执行更多的处理步骤,但差别很小。
在这种情况下,我认为你应该使用all()而不是过滤器来让你的代码更清楚你在做什么。
答案 1 :(得分:4)
从下面的Django' source code,它几乎是一样的。两种方法都调用_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