Django如何实现`filter`?是先选择所有内容然后进行过滤吗?

时间:2019-04-21 14:07:15

标签: django

我想用x = y返回Something.objects.get(x=y)的地方。

我已经阅读了Django中可能有filter的内容,但是我对Django是否正在做一些愚蠢的事情很谨慎,例如从内存中的数据库中选择所有内容,然后选择不存在的内容与python不匹配(就像rails一样)。

这是Django在做什么吗?如果是这样,我将只运行原始SQL。

我在Django docs中看到的唯一关于multiple的事情是MultipleObjectsReturned是一个例外。

2 个答案:

答案 0 :(得分: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 :(得分: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