Obtenha o último registro com filtro no Django

92

Estou tentando obter o objeto de modelo Django mais recente, mas não consigo ter sucesso.

Nenhum deles está funcionando:

obj = Model.objects.filter(testfield=12).latest()
obj = Model.objects.latest().filter(testfield=12)
doador
fonte
3
Você já tentou:obj= Model.objects.filter(testfield=12).order_by('-id')[:1]
catherine
@catherine, trabalhando como um encanto! : D. quer escrever isto como resposta para que eu possa verificar?
doador
Em 2018 NewsPostImage.objects.filter(newsPostTarget=img_id).first(). Espero que ajude.
Ngatia Frankline

Respostas:

103
obj= Model.objects.filter(testfield=12).order_by('-id')[0]
Catarina
fonte
10
@DaveMerwin não está incorreto; Existem várias maneiras de resolver esse problema, e tanto esta resposta quanto a outra estão corretas.
Jordan
1
Observe que isso pressupõe que id é um inteiro de chave primária sequenciado. O que normalmente é o padrão para django, mas às vezes não.
dalore
2
Isso pode ser perigoso porque o filtro pode retornar uma lista vazia
Kingston Chan
'-id' é usado para inverter a ordem!
Indra
3
talvez .first () em vez de [0]?
fevgenym
121

Veja os documentos de django: https://docs.djangoproject.com/en/dev/ref/models/querysets/#latest

Você precisa especificar um campo em latest (). por exemplo.

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

Ou se o Meta do seu modelo especifica get_latest_by, você pode deixar de fora o field_nameargumento para earliest() or latest(). Django usará o campo especificado get_latest_bypor padrão.

Pranav Singh
fonte
2
"Testfield" tem que ser um campo de data?
tani-rokk
17

latesté realmente projetado para funcionar com campos de data (provavelmente também funciona com outros tipos de ordem total, mas não tenho certeza). E a única maneira de usá-lo sem especificar o nome do campo é definindo o get_latest_bymetaatributo, conforme mencionado aqui .

acjay
fonte
8
Ele funciona com chaves primárias, você sempre pode fazer algo assim:Model.objects.latest('id')
Ander
6

obj= Model.objects.filter(testfield=12).order_by('-id')[:1] é a solução certa

Thomas John
fonte
0

Você pode fazer uma comparação com isso aqui.

imagem

latest('created')é o mesmo que order_by('-created').first() Por favor me corrija se eu estiver errado

Nikhil Bhardwaj
fonte