Dans Django, comment puis-je trier un modèle sur un champ et obtenir le dernier élément?

StackOverflow https://stackoverflow.com/questions/252242

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]
Était-ce utile?

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!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top