我想用x = y
返回Something.objects.get(x=y)
的地方。
我已经阅读了Django中可能有filter
的内容,但是我对Django是否正在做一些愚蠢的事情很谨慎,例如从内存中的数据库中选择所有内容,然后选择不存在的内容与python不匹配(就像rails一样)。
这是Django在做什么吗?如果是这样,我将只运行原始SQL。
我在Django docs中看到的唯一关于multiple
的事情是MultipleObjectsReturned
是一个例外。
答案 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
。