В django, как мне отсортировать модель на поле, а затем получить последний элемент?
В частности, у меня есть модель, которая имеет такое поле
pub_date = models.DateField("date published")
Я хочу иметь возможность легко захватить объект с самым последним pub_date
. Каков самый простой / лучший способ сделать это?
Будет ли что-то вроде следующего делать то, что я хочу?
Edition.objects.order_by('pub_date')[:-1]
5 ответов:
obj = Edition.objects.latest('pub_date')
Вы также можете упростить вещи, поместив
get_latest_by
в мете модели, то вы сможете сделатьobj = Edition.objects.latest()
Смотритедокументы для получения дополнительной информации. Вы, вероятно, также захотите установить
ordering
мета-вариант.
Ответ Харли - это способ пойти в том случае, когда вы хотите получить последнюю версию в соответствии с некоторыми критериями упорядочения для конкретных моделей, как вы это делаете, но общее решение состоит в том, чтобы изменить порядок и получить первый элемент:
Edition.objects.order_by('-pub_date')[0]
Примечание:
Обычные списки python принимают отрицательные индексы, которые обозначают смещение от конца списка, а не начало, как положительное число. Однако объекты QuerySet вызовут
AssertionError: Negative indexing is not supported.если вы используете отрицательный индекс, именно поэтому вы должны сделать то, что сказал инсин: изменить порядок и захватить элемент0th
.
Будьте осторожны с использованием
Edition.objects.order_by('-pub_date')[0]
Как вы могли бы индексировать пустой QuerySet. Я не уверен, что правильный Питонский подход, но самым простым было бы обернуть его в if / else или try / catch:
Но, как сказал @Harley, когда вы заказываете по дате,try: last = Edition.objects.order_by('-pub_date')[0] except IndexError: # Didn't find anything...
latest()
- это djangonic способ сделать это.
На это уже был дан ответ, но для более подробной справки, вот что говорит Книга Django о нарезке данных на QuerySets:
Обратите внимание, что отрицательная нарезка не поддерживается:
>>> Publisher.objects.order_by('name')[-1] Traceback (most recent call last): ... AssertionError: Negative indexing is not supported.
Хотя это легко обойти. Просто измените порядок.() утверждение, подобное этому:
>>> Publisher.objects.order_by('-name')[0]
Обратитесь к ссылке для получения более подробной информации. Надеюсь, это поможет!