No Django, como faço tipo um modelo em um campo e em seguida, obter o último item?
-
05-07-2019 - |
Pergunta
Especificamente, eu tenho um modelo que tem um campo como este
pub_date = models.DateField("date published")
Eu quero ser capaz de agarrar facilmente o objeto com a pub_date
mais recente. O que é o mais fácil melhor maneira / fazer isso?
Será que algo como o seguinte fazer o que eu quero?
Edition.objects.order_by('pub_date')[:-1]
Solução
obj = Edition.objects.latest('pub_date')
Você também pode simplificar as coisas, colocando get_latest_by
em Meta do modelo, então você vai ser capaz de fazer
obj = Edition.objects.latest()
os docs para mais informações. Você provavelmente também quer definir a opção ordering
Meta .
Outras dicas
A resposta de Harley é o caminho a percorrer para o caso em que você deseja que o mais recente acordo com alguns critérios de ordenação para determinados modelos, como você faz, mas a solução geral é inverter a ordem e recuperar o primeiro item:
Edition.objects.order_by('-pub_date')[0]
Nota:
listas normal do Python aceitar índices negativos, que significam um deslocamento do final da lista, em vez do início como um número positivo. No entanto, objetos QuerySet elevará
AssertionError: Negative indexing is not supported.se você usar um índice negativo, razão pela qual você tem que fazer o que insin disse:. Reverter a ordenação e agarrar o elemento
0th
Tenha cuidado de usar
Edition.objects.order_by('-pub_date')[0]
como você poderia ser indexar um QuerySet vazio. Eu não tenho certeza do que a abordagem Pythonic correta é, mas o mais simples seria envolvê-la em um if / else ou try / catch:
try:
last = Edition.objects.order_by('-pub_date')[0]
except IndexError:
# Didn't find anything...
Mas, como @Harley disse, quando você está requisitando por data, latest()
é a djangonic maneira de fazê-lo.
Esta já foi respondida, mas para mais de referência, isto é o que Django Livro tem a dizer sobre Divisão de dados em QuerySets:
Note que corte negativo não é suportado:
>>> Publisher.objects.order_by('name')[-1] Traceback (most recent call last): ... AssertionError: Negative indexing is not supported.
Esta é fácil de se locomover, no entanto. Basta alterar o order_by () declaração, como este:
>>> Publisher.objects.order_by('-name')[0]
Consulte o link para mais tais detalhes. Espero que ajude!