MultipleObjects返回了Django

时间:2018-09-03 19:56:58

标签: python django django-views

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

views.py

'q'

models.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})

urls.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)

我放入的数据库中目前有10个虚拟条目。

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

MultipleObjects在/ bookings /返回 get()返回了多个预订-它返回了10个!

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

请问如何解决此错误?

谢谢

1 个答案:

答案 0 :(得分:2)

就像名称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})