В частности, у меня есть модель с таким полем
pub_date = models.DateField("date published")
Я хочу иметь возможность легко захватить объект с помощью самой последней версии pub_date. Какой самый простой / лучший способ сделать это?
Что-то вроде следующего делает то, что я хочу?
Edition.objects.order_by('pub_date')[:-1]


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.if you use a negative index, which is why you have to do what insin said: reverse the ordering and grab the
0th element.
Будьте осторожны при использовании
Edition.objects.order_by('-pub_date')[0]
так как вы могли бы индексировать пустой QuerySet. Я не уверен, каков правильный подход Pythonic, но проще всего было бы обернуть его в if / else или try / catch:
try:
last = Edition.objects.order_by('-pub_date')[0]
except IndexError:
# Didn't find anything...
Но, как сказал @Harley, когда вы заказываете по дате, latest() - это способ джангонический сделать это.
На этот вопрос уже был дан ответ, но для большей справки это то, что Книга Джанго говорит о срезании данных в QuerySets:
Note that negative slicing is not supported:
>>> Publisher.objects.order_by('name')[-1] Traceback (most recent call last): ... AssertionError: Negative indexing is not supported.This is easy to get around, though. Just change the order_by() statement, like this:
>>> Publisher.objects.order_by('-name')[0]
Перейдите по ссылке для получения более подробной информации. Надеюсь, это поможет!