Obtenez le dernier enregistrement avec filtre dans Django


90

J'essaye d'obtenir le dernier objet modèle Django mais je n'arrive pas à réussir.

Aucun de ces éléments ne fonctionne:

obj = Model.objects.filter(testfield=12).latest()
obj = Model.objects.latest().filter(testfield=12)

3
Avez-vous essayé:obj= Model.objects.filter(testfield=12).order_by('-id')[:1]
catherine

@catherine, travaille comme un charme! :RÉ. voulez-vous écrire ceci comme réponse pour que je puisse la vérifier?
doniyor

En 2018 NewsPostImage.objects.filter(newsPostTarget=img_id).first(). J'espère que cela aide.
Ngatia Frankline

Réponses:


101
obj= Model.objects.filter(testfield=12).order_by('-id')[0]

10
@DaveMerwin ce n'est pas incorrect; il existe plusieurs façons de résoudre ce problème, et cette réponse et l'autre sont correctes.
Jordan

1
Notez que cela suppose que id est un entier de clé primaire séquencé. Ce qui est normalement la valeur par défaut pour django, mais parfois non.
dalore

2
Cela pourrait être dangereux car le filtre pourrait renvoyer une liste vide
Kingston Chan

'-id' est utilisé pour inverser l'ordre!
Indra

3
peut-être .first () au lieu de [0]?
fevgenym

119

Voir la documentation de django: https://docs.djangoproject.com/en/dev/ref/models/querysets/#latest

Vous devez spécifier un champ dans latest (). par exemple.

obj= Model.objects.filter(testfield=12).latest('testfield')

Ou si la méta de votre modèle spécifie get_latest_by, vous pouvez laisser l' field_nameargument à earliest() or latest(). Django utilisera le champ spécifié get_latest_bypar défaut.


2
"Testfield" doit-il être un champ de date?
tani-rokk


17

latestest vraiment conçu pour fonctionner avec les champs de date (cela fonctionne probablement aussi avec d'autres types à ordre total, mais pas sûr). Et la seule façon de l'utiliser sans spécifier le nom du champ est de définir l' get_latest_byattribut meta, comme mentionné ici .


8
Cela fonctionne avec les clés primaires, vous pouvez toujours faire quelque chose comme ceci:Model.objects.latest('id')
Ander

6

obj= Model.objects.filter(testfield=12).order_by('-id')[:1] est la bonne solution

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.