Django — получить последний элемент от get_object_or_404

Я хочу вернуть объект из моего метода get_object_or_404, но мой запрос возвращает несколько объектов. Есть ли способ получить последний или первый элемент?

Вот как я это делаю:

return get_object_or_404(BatchLog, batch_id=self.kwargs["pk"]) 

Я знаю, что это невозможно, но это то, что мне нужно:

return get_object_or_404(BatchLog, batch_id=self.kwargs["pk"].last())
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
1 288
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

get_object_or_404 эквивалентно:

from django.http import Http404

def my_view(request):
    try:
        obj = MyModel.objects.get(pk=1)
    except MyModel.DoesNotExist:
        raise Http404("No MyModel matches the given query.")

В вашем случае вы можете сделать:

    try:
        obj = MyModel.objects.filter(pk=1).last()
    except:
        raise Http404("No MyModel matches the given query.")

или лучше, если у вас есть способ их заказать:

    try:
        obj = MyModel.objects.order_by('date_created').filter(pk=1).last()
    except:
        raise Http404("No MyModel matches the given query.")
Ответ принят как подходящий

Как сказано в документации, вы можете использовать экземпляр QuerySet вместо класса модели.

Это должно работать:

return get_object_or_404(
    BatchLog.objects.order_by('-date')[:1],
    batch_id=self.kwargs["pk"],
) 

Обратите внимание, что нам нужно ограничить QuerySet вместо использования .first() или .last(), которые дали бы нам объект.

Но на самом деле может быть лучше сделать это вручную:

try:
    return BatchLog.objects.filter(batch_id=self.kwargs["pk"])[0]
except IndexError:
    raise Http404('No logs for this id')

и этот ответ, и ответ @Henri имеют смысл и, вероятно, будут работать, но вместо получения 404 получите объект BatchLog с пустыми или нулевыми полями

Burak Akyalçın 15.12.2020 11:44

О, мой плохой. first() возвращает None вместо ошибки. Позвольте мне изменить это.

Martí 15.12.2020 11:51

Другие вопросы по теме