Django-限制查询结果


Answers:


304

Django查询集很懒。这意味着查询仅在您明确要求结果时才会命中数据库。

因此,在您打印或实际使用查询结果之前,无需进行数据库访问就可以进一步过滤。

如您在下面看到的,您的代码仅执行一个sql查询以仅获取最后10个项目。

In [19]: import logging                                 
In [20]: l = logging.getLogger('django.db.backends')    
In [21]: l.setLevel(logging.DEBUG)                      
In [22]: l.addHandler(logging.StreamHandler())      
In [23]: User.objects.all().order_by('-id')[:10]          
(0.000) SELECT "auth_user"."id", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."password", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."is_superuser", "auth_user"."last_login", "auth_user"."date_joined" FROM "auth_user" ORDER BY "auth_user"."id" DESC LIMIT 10; args=()
Out[23]: [<User: hamdi>]

我在mongoDB上尝试过,它说不支持SELECT。如何在mongoDB上执行此操作?
winux

@winux因为这是特定于Django的,所以听起来您可能需要研究设置Django以专门用于Mongo / NoSQL类型的数据库。就标准Django ORM设置而言,根据我的经验,这不是典型的设置。
匿名co

38

实际上,我认为LIMIT 10它将被发布到数据库,因此切片不会在Python中发生,而是在数据库中发生。

有关更多信息,请参见限制查询集。


请注意,这不适用于需要过滤的查询集,因为切片后无法过滤。
Mike'Pomax'Kamermans

2
因此,首先进行筛选,而不是切片。感谢Davor的链接!
Vyachez

13

看起来问题中的解决方案不再适用于Django 1.7,并引发错误:“一旦获取切片,就无法对查询重新排序”

根据文档https://docs.djangoproject.com/en/dev/topics/db/queries/#limiting-querysets强制使用Python slice语法的“ step”参数评估查询。它是这样工作的:

Model.objects.all().order_by('-id')[:10:1]

仍然我想知道限制是在SQL还是Python中执行的,是对返回的整个结果数组进行切片。将巨大的列表检索到应用程序内存是没有好处的。


即使django> = 1.8进行了测试,该解决方案也不起作用。
sonus21

3

是。如果要获取对象的有限子集,则可以使用以下代码:

例:

obj=emp.objects.all()[0:10]

开头的0是可选的,所以

obj=emp.objects.all()[:10]

上面的代码返回前10个实例。


1

作为对其他有用答案的补充和观察,值得注意的是[:10],切片实际上 将返回列表的前10个元素,而不是后10 个元素

要获得最后的10个,您应该[-10:]改为这样做(请参阅此处)。这将帮助您避免使用order_by('-id')-反转元素。


1
我尝试了此操作,并得到了“不支持负索引”。
bparker

@DarkCygnus Product.objects.filter(~Q(price=0))[-5:]导致我同样的错误:“不支持负索引。”
bersam

在django上的查询集上,这不起作用:code.djangoproject.com/ticket/13089如果将查询集转换为列表,它将起作用。
valem
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.