Dans django, comment trier un modèle sur un champ, puis obtenir le dernier élément?
Plus précisément, j'ai un modèle qui a un champ comme celui-ci
pub_date = models.DateField("date published")
Je veux être capable de saisir facilement l'objet avec le pub_date
le plus récent. Quelle est la méthode la plus simple/la meilleure façon de le faire?
Est-ce que quelque chose comme ce qui suit ferait ce que je veux?
Edition.objects.order_by('pub_date')[:-1]
5 réponses
obj = Edition.objects.latest('pub_date')
Vous pouvez également simplifier les choses en mettant get_latest_by
dans la méta du modèle, alors vous serez en mesure de faire
obj = Edition.objects.latest()
Voir les documents pour plus d'informations. Vous voudrez probablement aussi définir le ordering
Option Meta.
La réponse de Harley est la voie à suivre pour le cas où vous voulez le dernier en fonction de certains critères de commande pour des modèles particuliers, comme vous le faites, mais la solution générale est d'inverser la commande et de récupérer le premier élément:
Edition.objects.order_by('-pub_date')[0]
Remarque:
Les listes Python normales acceptent les index négatifs, qui signifient un décalage par rapport à la fin de la liste, plutôt que le début comme un nombre positif. Cependant, les objets QuerySet déclencheront
AssertionError: Negative indexing is not supported.si vous utilisez un index négatif, c'est pourquoi vous devez faire ce que dit insin: Inverser l'ordre et saisir l'élément
0th
. Faites attention d'utiliser
Edition.objects.order_by('-pub_date')[0]
Comme vous pouvez indexer un QuerySet vide. Je ne suis pas sûr de la bonne approche pythonique, mais le plus simple serait de l'envelopper dans un if / else ou try / catch:
try:
last = Edition.objects.order_by('-pub_date')[0]
except IndexError:
# Didn't find anything...
Mais, comme l'a dit @Harley, lorsque vous commandez par date, latest()
est la façondjangonic de le faire.
Cela a déjà été répondu, mais pour plus de référence, c'est ce que Django Book A à dire sur le découpage des données sur les QuerySets:
Notez que le découpage 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. Espérons que ça aide!