我正在尝试显示一个页面,该页面在页面上显示预订模型中的所有预订。
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进行渲染。
请问如何解决此错误?
谢谢
答案 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})