django objects.all() vs objects.filter()



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

最新更新