100 votes

Obtenir le dernier enregistrement dans un queryset

Comment puis-je récupérer le dernier enregistrement dans un certain queryset ?

147voto

Asinox Points 1817

Doc Django :

latest(field_name=None) renvoie le dernier objet de la table, par date, en utilisant le nom du champ fourni comme champ de date.

Cet exemple renvoie l'entrée la plus récente dans le tableau, en fonction de l'ordre d'entrée des données. pub_date champ :

Entry.objects.latest('pub_date')

5 votes

C'est la meilleure façon de le faire. De plus, "Si la Meta de votre modèle spécifie get_latest_by, vous pouvez laisser de côté l'argument field_name de latest()", comme indiqué dans la documentation.

88voto

jujule Points 4353

EDIT : Vous devez maintenant utiliser Entry.objects.latest('pub_date')


Vous pourriez simplement faire quelque chose comme ça, en utilisant reverse() :

queryset.reverse()[0]

Faites également attention à cet avertissement de la documentation de Django :

... noter que reverse() devrait généralement être appelé uniquement sur un QuerySet qui a un ordre défini (par ex, lors de l'interrogation d'un modèle qui qui définit un ordre par défaut, ou lorsque l'utilisation de order_by() ). Si aucun ordre de ce type n'est défini pour un QuerySet , en appelant reverse() sur elle n'a pas de réel effet (la commande était indéfinie avant d'appeler reverse() et restera resteront indéfinis par la suite).

2 votes

Comme indiqué dans la documentation de django, : "notez que reverse() ne doit généralement être appelé que sur un QuerySet dont l'ordre est défini (par exemple, lors d'une requête sur un modèle qui définit un ordre par défaut, ou lors de l'utilisation de order_by()). Si aucun ordre n'est défini pour un QuerySet donné, l'appel de reverse() sur celui-ci n'a aucun effet réel (l'ordre était indéfini avant l'appel de reverse(), et le restera par la suite)."

6 votes

2017 et les réponses acceptées sont maintenant dépassées. Comme indiqué ci-dessous, vous devez utiliser queryset.last().

34voto

panchicore Points 3288

Django >= 1.6

Ajout des méthodes first() et last() de QuerySet, qui sont des méthodes pratiques renvoyant le premier ou le dernier objet correspondant aux filtres. Elle renvoie None si aucun objet ne correspond.

7voto

jifeng.yin Points 581

Lorsque l'ensemble de requêtes est déjà épuisé, vous pouvez faire cela pour éviter une autre indication de la base de données.

last = queryset[len(queryset) - 1] if queryset else None

N'utilisez pas try...except... .
Django ne jette pas IndexError dans ce cas.
Il jette AssertionError o ProgrammingError (lorsque vous exécutez python avec l'option -O)

1 votes

En supposant que votre ensemble de requêtes soit déjà ordonné, cette solution devrait être la meilleure, car c'est la seule qui n'interroge pas à nouveau la base de données.

4voto

Mutant Points 952

Si vous utilisez django 1.6 et plus, c'est beaucoup plus facile maintenant que la nouvelle interface utilisateur a été introduite.

Model.object.earliest()

Cela donnera latest() avec une direction inverse.

p.s. - Je sais qu'il s'agit d'une vieille question, mais j'aimerais qu'à l'avenir, si quelqu'un se pose cette question, il connaisse cette nouvelle fonctionnalité et ne finisse pas par utiliser l'ancienne méthode.

3 votes

D'après la documentation : earliest() et latest() nécessitent soit un paramètre field_name, soit 'get_latest_by' dans le modèle.

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