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]
21
demandé sur Harley Holcombe 2008-10-31 03:26:09

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.

33
répondu Harley Holcombe 2008-10-31 02:26:45

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]
21
répondu Jonny Buchanan 2008-10-31 01:59:17

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.
4
répondu Dan 2008-10-31 03:01:01

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.

2
répondu Yogi 2008-11-02 19:42:00

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!

0
répondu Forbidden Overseer 2013-07-31 06:53:41