【问题标题】:MultipleObjectsReturned DjangoMultipleObjectsReturned Django
【发布时间】:2018-09-03 19:56:58
【问题描述】:

我正在尝试在一个页面上显示一个显示 Booking 模型中所有预订的页面。

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 个虚拟条目。

当我尝试转到预订页面时,我得到:

MultipleObjectsReturned 在 /bookings/ get() 返回了多个 Booking -- 它返回了 10 个!

这就是我想要的,我想要 10 个 Booking 对象。想法是将其传递给 html 进行渲染。

我该如何解决这个错误?

【问题讨论】:

  • 使用get_list_or_404而不是get_object_or_404,后者将调用.get()并触发错误。

标签: python django django-views


【解决方案1】:

正如名称get_object_or_404 所暗示的那样,它用于检索单个 元素。在幕后,它在查询集上调用.get(),如果没有元素,它会引发异常,或者由documentation 指定:

在给定模型管理器上调用 get(),但它引发 Http404 而不是模型的 DoesNotExist 异常。

get_object_or_404 但是有一个返回元素集合的 slibing:get_list_or_404 [Django-doc]。不同之处在于,如果集合为空,则会引发异常,并且我们会获得一个元素集合。或者像文档中指定的那样:

将给定模型管理器上filter() 的结果返回到列表,如果结果列表为空,则提高Http404

所以我们可以将视图实现为:

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

注意:如果您不想在任何东西上使用.filter() 查询集,建议改用.all()

如果您不想将查询集具体化为列表,我们可以自己实现检查:

from django.http import Http404

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

【讨论】:

  • 这完全解决了问题,我需要在发布之前做更多的研究。谢谢
猜你喜欢
  • 1970-01-01
  • 2017-11-05
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 2021-07-07
  • 2022-01-25
  • 2016-08-25
相关资源
最近更新 更多