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

时间:2018-04-03 13:02:26

标签: python django

Queryset.objects.all()返回所有对象,

Queryset.objects.filter()也会返回所有对象。

我有两个使用Queryset.objects.filter()的查询,我想用它来返回所有对象。

问题Queryset.objects.all()Queryset.objects.filter() 效果是否相同?

2 个答案:

答案 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