Django中如何查询指定saloon的预订记录 解决WSGIRequest无saloon属性报错
报错原因
Django原生请求对象WSGIRequest没有内置saloon属性,代码中直接调用self.request.saloon属于未定义属性调用,因此触发报错。
修复方案
你已经定义了SignUp关联表存储用户和门店的绑定关系,因此可以通过当前登录用户request.user查询对应的关联记录,获取saloon实例。同时原代码中使用get()查询预订记录仅能返回单条结果,无法满足多记录查询和统计需求,需改用filter()结合聚合查询实现统计功能。
修正后的完整代码
from django.db.models import Count from django.shortcuts import redirect class SaloonCheckBooking(TemplateView): template_name = 'saloonCheck.html' def get(self, request, *args, **kwargs): # 校验用户登录状态 if not request.user.is_authenticated: return redirect('login') # 获取当前用户绑定的门店 try: user_signup = SignUp.objects.select_related('saloon').get(user=request.user) except SignUp.DoesNotExist: return render(request, self.template_name, {'error': '当前账号未绑定任何门店'}) current_saloon = user_signup.saloon # 1、获取门店所有预订记录,可在前端自行遍历展示 all_bookings = Booking.objects.filter(saloon=current_saloon).order_by('date', 'time') # 2、直接统计不同服务对应各时段的预约人数,降低前端计算压力 booking_stats = Booking.objects.filter(saloon=current_saloon).values('service', 'date', 'time').annotate( reserve_count=Count('id') ).order_by('service', 'date', 'time') return render(request, self.template_name, { 'all_bookings': all_bookings, 'booking_stats': booking_stats })
可选优化
如果业务要求一个用户只能绑定一个门店,可以给SignUp模型的user字段添加唯一约束,避免查询时返回多条记录报错:
class SignUp(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, unique=True) saloon = models.ForeignKey(SaloonRegister, on_delete=models.CASCADE) contact_no = models.BigIntegerField()
内容的提问来源于stack exchange,提问作者smith
相关产品推荐
相关产品推荐

