web-dev-qa-db-fra.com

Obtenir le dernier enregistrement d'un ensemble de requêtes

Comment puis-je récupérer le dernier enregistrement dans un certain ensemble de requêtes?

72
Stephen

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

queryset.reverse()[0]

Attention également à cet avertissement de la documentation Django:

... notez que reverse() ne devrait généralement être appelé que sur un QuerySet qui a un ordre défini (par exemple, lorsque vous interrogez un modèle qui définit un ordre par défaut, ou lorsque vous utilisez order_by()) . Si aucun ordre de ce type n'est défini pour un QuerySet donné, l'appel de reverse() n'a aucun effet réel (l'ordre n'était pas défini avant d'appeler reverse() et restera indéfini après).

71
jujule

Django Doc :

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

Cet exemple renvoie la dernière entrée du tableau, selon pub_date champ:

Entry.objects.latest('pub_date')
117
Asinox

Django> = 1,6

Ajout des méthodes QuerySet first () et last () qui sont des méthodes pratiques renvoyant le premier ou le dernier objet correspondant aux filtres. Renvoie None s'il n'y a aucun objet correspondant.

31
panchicore

La façon la plus simple de le faire est:

books.objects.all().last()

Vous l'utilisez également pour obtenir la première entrée comme ceci:

books.objects.all().first()
30
haky_nash

Pour obtenir le premier objet:

ModelName.objects.first()

Pour obtenir les derniers objets:

ModelName.objects.last()

Vous pouvez utiliser un filtre

ModelName.objects.filter(name='simple').first()

Cela fonctionne pour moi.

21
Ravi Kumar

Lorsque le jeu de requêtes est déjà épuisé, vous pouvez le faire pour éviter un autre indice db -

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

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

6
jifeng.yin

Si vous utilisez Django 1.6 et plus, c'est beaucoup plus facile maintenant que la nouvelle API a été introduite -

Model.object.earliest()

Il donnera le dernier () avec sens inverse.

p.s. - Je connais son ancienne question, je poste comme si quelqu'un avançait sur cette question, ils apprennent à connaître cette nouvelle fonctionnalité et ne finissent pas par utiliser l'ancienne méthode.

3
Mutant