我想回到x = y
与Something.objects.get(x=y)
的地方。
我已经读过在Django中可能有一个filter
的东西,但是我很担心Django是否在做一些愚蠢的事情,比如从内存中的数据库中选择一切,然后选择与python不匹配的东西(如rails的方式)。
这是Django正在做的事情吗?如果是这样,我将只运行原始SQL。
我在Django docs关于multiple
的唯一看法是MultipleObjectsReturned
是一个例外。
你想要.filter
。它将返回QuerySet
的一个实例。在您尝试迭代QuerySet
之前,不会执行查询。这允许您链接调用以构建复杂查询。
查询是在SQL中完成的,而不是在python中完成的。
您可以通过在生成的.query
上查看QuerySet
来检查将运行的查询。
>>> Something.objects.filter(x='y').query
SELECT id, x, etc from something where x='y';
.get
用于获取单个对象。
(...)但是我厌倦了天气Django正在做一些愚蠢的事情,比如从内存中的数据库中选择所有东西然后挑选与python不匹配的东西(就像rails的方式那样)。
不,Django的ORM将创建一个SQL查询。除非您以某种方式修补对象管理器,否则它将生成一个查询,其中过滤发生在数据库端。
如果你想要满足给定条件的所有元素,你应该使用.filter(..)
:
SomeModel.objects.filter(x=y)
这将返回一个QuerySet
:一个SomeModel
对象的集合(可能是空的)。
如果要检索单个元素,请使用.get(..)
:
SomeModel.objects.get(x=y)
如果没有这样的记录,这将返回SomeModel.DoesNotExist
,如果找到给定条件的两个或更多记录,则返回SomeModel.MultipleObjectsReturned
。