Django如何实现`filter`?是选择一切然后过滤?

问题描述 投票:1回答:2

我想回到x = ySomething.objects.get(x=y)的地方。

我已经读过在Django中可能有一个filter的东西,但是我很担心Django是否在做一些愚蠢的事情,比如从内存中的数据库中选择一切,然后选择与python不匹配的东西(如rails的方式)。

这是Django正在做的事情吗?如果是这样,我将只运行原始SQL。

我在Django docs关于multiple的唯一看法是MultipleObjectsReturned是一个例外。

django
2个回答
3
投票

你想要.filter。它将返回QuerySet的一个实例。在您尝试迭代QuerySet之前,不会执行查询。这允许您链接调用以构建复杂查询。

查询是在SQL中完成的,而不是在python中完成的。

您可以通过在生成的.query上查看QuerySet来检查将运行的查询。

>>> Something.objects.filter(x='y').query
SELECT id, x, etc from something where x='y';

.get用于获取单个对象。


1
投票

(...)但是我厌倦了天气Django正在做一些愚蠢的事情,比如从内存中的数据库中选择所有东西然后挑选与python不匹配的东西(就像rails的方式那样)。

不,Django的ORM将创建一个SQL查询。除非您以某种方式修补对象管理器,否则它将生成一个查询,其中过滤发生在数据库端。

如果你想要满足给定条件的所有元素,你应该使用.filter(..)

SomeModel.objects.filter(x=y)

这将返回一个QuerySet:一个SomeModel对象的集合(可能是空的)。

如果要检索单个元素,请使用.get(..)

SomeModel.objects.get(x=y)

如果没有这样的记录,这将返回SomeModel.DoesNotExist,如果找到给定条件的两个或更多记录,则返回SomeModel.MultipleObjectsReturned

© www.soinside.com 2019 - 2024. All rights reserved.