Dans Django, comment puis-je trier un modèle sur un champ et obtenir le dernier élément?
-
05-07-2019 - |
Question
Plus précisément, j'ai un modèle qui a un champ comme celui-ci
pub_date = models.DateField("date published")
Je veux pouvoir facilement saisir l'objet avec la date_pub
la plus récente. Quel est le moyen le plus facile / le meilleur de faire cela?
Est-ce que quelque chose comme ce qui suit va faire ce que je veux?
Edition.objects.order_by('pub_date')[:-1]
La solution
obj = Edition.objects.latest('pub_date')
Vous pouvez également simplifier les choses en ajoutant get_latest_by
dans la méta du modèle, vous pourrez alors le faire
obj = Edition.objects.latest()
Voir les documents pour plus d'informations. Vous voudrez probablement également définir le ordre
Option méta.
Autres conseils
La réponse de Harley est la meilleure solution pour le cas où vous souhaitez obtenir les dernières informations en fonction de certains critères de commande pour des modèles particuliers, mais la solution générale consiste à inverser la commande et à récupérer le premier élément:
Edition.objects.order_by('-pub_date')[0]
Remarque:
Les listes python normales acceptent les index négatifs, ce qui signifie un décalage par rapport à la fin de la liste, plutôt que le début comme un nombre positif. Cependant, les objets QuerySet vont apparaître
AssertionError: Negative indexing is not supported.si vous utilisez un index négatif, raison pour laquelle vous devez faire ce qui est insin: inverser l'ordre et saisir l'élément
0th
.
Faites attention à utiliser
Edition.objects.order_by('-pub_date')[0]
comme vous êtes en train d’indexer un QuerySet vide. Je ne sais pas quelle est la bonne approche Pythonic, mais le plus simple serait de l’envelopper dans un if / else ou d’essayer / attraper:
try:
last = Edition.objects.order_by('-pub_date')[0]
except IndexError:
# Didn't find anything...
Mais, comme @Harley l'a dit, lorsque vous commandez par date, latest ()
est la manière djangonique de le faire.
Ceci a déjà été répondu, mais pour plus de référence, voici ce que Livre Django dit à propos des données de découpage sur les ensembles de requêtes:
Notez que le découpage en négatif n'est pas pris en charge:
>>> Publisher.objects.order_by('name')[-1] Traceback (most recent call last): ... AssertionError: Negative indexing is not supported.
C’est facile de se déplacer, cependant. Il suffit de changer le order_by () déclaration, comme ceci:
>>> Publisher.objects.order_by('-name')[0]
Reportez-vous au lien pour plus de détails. J'espère que ça aide!