Я хочу вернуть объект из моего метода 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())
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')
О, мой плохой. first()
возвращает None
вместо ошибки. Позвольте мне изменить это.
и этот ответ, и ответ @Henri имеют смысл и, вероятно, будут работать, но вместо получения 404 получите объект
BatchLog
с пустыми или нулевыми полями