304 votes

Django - limiter les résultats de la requête

Je veux prendre le dernier 10 instances d'un modèle et d'avoir ce code:

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

Est-il vrai que, premièrement, de ramasser tous les cas, et puis prendre seulement 10 derniers? Est-il une méthode plus efficace?

444voto

hamdiakoguz Points 2450

Django querysets sont paresseux. Que signifie une requête, le succès à la base de données uniquement lorsque vous demandez spécifiquement pour le résultat.

Donc, jusqu'à ce que vous l'imprimer ou l'utiliser réellement le résultat d'une requête vous pouvez filtrer davantage avec les pas de base de données access.

Comme vous pouvez le voir ci-dessous votre code ne s'exécute une requête sql pour récupérer uniquement les 10 derniers articles.

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>]

64voto

Davor Lucic Points 11072

En fait, je pense que l' LIMIT 10 seraient émises à la base de données afin de découpage n'aura pas lieu en Python, mais dans la base de données.

Voir limitant querysets pour plus d'informations.

1voto

Daniel Roseman Points 199743

Non, il n'est pas vrai, comme l'a clairement expliqué dans la documentation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X