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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django如何实现`filter`?是选择一切然后过滤?相关的知识,希望对你有一定的参考价值。

我想回到x = ySomething.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

以上是关于Django如何实现`filter`?是选择一切然后过滤?的主要内容,如果未能解决你的问题,请参考以下文章

选择一个有效的选择 Django Filtered Drop Down Menu

Django-Filter:外键字段上的多个 select2 选择

django objects.all 怎么选择数据

将 django-select2 与 django-filters 连接

需要用ajax调用实现django-filter

如何实现多个过滤器 Django?