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)

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]

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.


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 .


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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.