2008-10-31 3 views
21

В частности, у меня есть модель, которая имеет поле, как этотВ django, как мне отсортировать модель на поле, а затем получить последний элемент?

pub_date = models.DateField("date published") 

Я хочу, чтобы иметь возможность легко захватить объект с самым последним pub_date. Каков самый простой/лучший способ сделать это?

Может, что-то вроде следующего делать то, что я хочу?

Edition.objects.order_by('pub_date')[:-1] 

ответ

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

Вы также можете упростить вещи, поставив get_latest_by в Meta модели, то вы будете в состоянии сделать

obj = Edition.objects.latest() 

the docs Смотрите для получения дополнительной информации. Вероятно, вы также захотите установить опцию ordering Meta.

21

ответ Harley является способом пойти в случае, когда вы хотите, последнюю в соответствии с некоторыми критериями упорядочения для конкретных моделей, как вы, но общее решение отменить заказ и получить первый элемент:

Edition.objects.order_by('-pub_date')[0] 
4

Примечание:

Нормальные списки питона принимают отрицательные индексы, которые означают смещение от конца списка, а не в начале, как положительное число. Тем не менее, объекты QuerySet будут поднять

AssertionError: Negative indexing is not supported.
, если вы используете отрицательный индекс, поэтому вам нужно сделать то, что сказал insin: отменить порядок и захватить элемент 0th.

2

Будьте осторожны с использованием

Edition.objects.order_by('-pub_date')[0] 

, как вы могли бы быть индексации пустой QuerySet. Я не уверен, что правильно Pythonic подход, но проще было бы обернуть его в если/другое или попробовать/поймать:

try: 
    last = Edition.objects.order_by('-pub_date')[0] 
except IndexError: 
    # Didn't find anything... 

Но, как сказал @Harley, когда Вы заказываете по дата, latest() является djangonic способ сделать это.

0

Это уже был дан ответ, но для получения дополнительной справки, это то, что Django Book должен сказать о Строгание данных о QuerySets:

Обратите внимание, что отрицательное нарезка не поддерживается:

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

Этот легко обойти. Просто измените order_by() заявления, например:

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

Обратится по ссылке для более таких деталей. Надеюсь, это поможет!