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]
Foi útil?

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top