No Django, como faço para classificar um modelo em um campo e em seguida, obter o último item?

votos
21

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 mais recente pub_date. O que é o mais fácil melhor maneira / fazer isso?

Seria algo como o seguinte fazer o que eu quero?

Edition.objects.order_by('pub_date')[:-1]
Publicado 31/10/2008 em 01:26
fonte usuário
Em outras línguas...                            


5 respostas

votos
33

obj = Edition.objects.latest('pub_date')

Você também pode simplificar as coisas, colocando get_latest_byem Meta do modelo, então você vai ser capaz de fazer

obj = Edition.objects.latest()

Consulte a documentação para obter mais informações. Provavelmente você também quiser definir a orderingopção de Meta.

Respondeu 31/10/2008 em 01:34
fonte usuário

votos
21

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]
Respondeu 31/10/2008 em 02:59
fonte usuário

votos
4

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: indexação negativa não é suportado.
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 0thelemento.

Respondeu 31/10/2008 em 04:01
fonte usuário

votos
2

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 disse @Harley, quando você está requisitando por data, latest()é o djangonic maneira de fazê-lo.

Respondeu 02/11/2008 em 20:26
fonte usuário

votos
0

Este 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-se que o corte negativo não é suportado:

>>> Publisher.objects.order_by('name')[-1]
Traceback (most recent call last):
  ...
AssertionError: Negative indexing is not supported.

Isto é fácil de se locomover, no entanto. Basta alterar a declaração order_by (), assim:

>>> Publisher.objects.order_by('-name')[0]

Consulte o link para mais tais detalhes. Espero que ajude!

Respondeu 31/07/2013 em 07:53
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more