django objects.all()与objects.filter()的区别

13

Queryset.objects.all() 返回所有对象,同样的,Queryset.objects.filter() 也会返回所有对象。

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

问题: Queryset.objects.all()Queryset.objects.filter()性能是否相同?


4
如果您想了解查询的执行情况,请查看Django调试工具栏。除了原始SQL查询和查询频率之外,您还可以看到执行所需的时间。 - hansTheFranz
那是个好主意,我得试试。 - Hadi Farhadi
2个回答

11

是的,如果不传递过滤器参数,则从数据库角度来看,两者表现相同。一旦需要检查是否传递了参数,过滤器将执行更多的处理步骤,但差异会非常小。

在这种情况下,我建议您使用 all() 而不是 filter() ,以使您的代码更清晰明了。


6
从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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接