MultipleObjectsReturned Django - PullRequest
       9

MultipleObjectsReturned Django

0 голосов
/ 03 сентября 2018

Я пытаюсь отобразить страницу, на которой показаны все бронирования в модели бронирования на странице.

views.py

def bookings(request):
    booking_list = get_object_or_404(Booking.objects.filter().order_by("-day"))
    return render(request, 'roombooker/base.html', {'booking_list': booking_list})

models.py

class Booking(models.Model):
    day = models.DateField(u'Booking Day',help_text=u'Day of Booking')
    start_time = models.TimeField(u'Start Time', help_text=u'Start Time')
    end_time = models.TimeField(u'End Time', help_text=u'End Time')
    user = models.ForeignKey('User', on_delete=models.SET_NULL,null=True)
    room = models.ForeignKey('Room', on_delete=models.SET_NULL,null=True)

urls.py

urlpatterns =[
    url(r'^bookings/',views.bookings, name='bookings'),
]

На данный момент в БД есть 10 фиктивных записей.

Когда я пытаюсь перейти на страницу бронирования, я получаю

MultipleObjectsВозврат на / бронирования / get () вернул более одного бронирования - вернул 10!

Что я хочу, я хотел 10 объектов бронирования. Идея состояла в том, чтобы передать его в HTML для рендеринга.

Как я могу решить эту ошибку, пожалуйста?

Спасибо

1 Ответ

0 голосов
/ 03 сентября 2018

Как следует из названия get_object_or_404, это используется для извлечения одного элемента. За занавесом он вызывает .get() в наборе запросов, а в случае отсутствия элемента он вызывает исключение или значение, указанное в документации :

Вызывает get() для данного менеджера модели, но вызывает Http404 вместо исключения DoesNotExist модели.

get_object_or_404 однако имеет проскальзывание, которое возвращает набор элементов: get_list_or_404 [Django-doc] . Разница в том, что здесь возникает исключение, если набор пуст, и мы получаем коллекцию элементов. Или как указано в документации:

Возвращает результат filter() для данного менеджера моделей, приведенного к списку, поднимая Http404, если результирующий список пуст.

Таким образом, мы можем реализовать вид как:

def bookings(request):
    booking_list = <b>get_list_or_404</b>(Booking.objects.filter().order_by("-day"))
    return render(request, 'roombooker/base.html', {'booking_list': booking_list})

Примечание : если вы не хотите .filter() набор запросов для чего-либо, рекомендуется использовать .all() вместо этого.

Если вы не хотите материализовать набор запросов в список, мы можем выполнить проверку самостоятельно с помощью:

from django.http import <b>Http404</b>

def bookings(request):
    booking_list = Booking.objects.all().order_by("-day")
    if not book_list:
        <b>raise Http404('No bookings found')</b>
    return render(request, 'roombooker/base.html', {'booking_list': booking_list})
...