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)
donateur
la source
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]
Catherine
la source
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.

Pranav Singh
la source
2
"Testfield" doit-il être un champ de date?
tani-rokk
25

dernier () dernier ()

Utilisez le dernier ():

ModelName.objects.last()

en utilisant la dernière ():

ModelName.objects.latest('id')
Subin Shrestha
la source
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 .

acjay
la source
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

Thomas John
la source