Django Rest Framework单个POST方法如何实现多表数据更新
原有代码逻辑错误点
- 判断条件错误:原有逻辑判断的是「数据库中是否存在任意一条预约日期为今日的记录」,没有判断本次提交的预约日期是否为当日,触发条件完全不符合需求
- 更新逻辑错误:
TimeInterval.objects.update(status=True)会把所有时间段记录的状态批量改成True,和需求要求的「关联时间段设为不可用(False)」完全相反 - 操作顺序错误:原有逻辑在创建TokenDetail记录之前就执行状态更新,且没有精准定位到本次提交关联的单条TimeInterval记录,做了无差别全表更新
- 类型不匹配:从请求参数中拿到的
bookingdate是字符串格式,直接和date类型的当日日期比较会出现判断失效的问题
修正后的视图代码
import datetime from rest_framework.response import Response from rest_framework.decorators import api_view from accounts.models import User from vendor.models import TimeInterval, ServiceDetail, VendorDetail from customer.models import TokenDetail @api_view(['POST']) def tokendetailsAdd(request): # 提取请求参数 customer_id = request.data.get('customerid') custname = User.objects.get(id=customer_id) # 转换日期格式,统一为date类型做比较 bookingdate_str = request.data.get('bookingdate') bkngdate = datetime.datetime.strptime(bookingdate_str, "%Y-%m-%d").date() time_interval_id = request.data.get('bookingtime') bkngtime = TimeInterval.objects.get(id=time_interval_id) service_id = request.data.get('servicename') srvcname = ServiceDetail.objects.get(id=service_id) vendor_id = request.data.get('vendorname') vndrname = VendorDetail.objects.get(id=vendor_id) # 先写入TokenDetail记录 TokenDetail.objects.create( customername=custname, bookingdate=bkngdate, bookingtime=bkngtime, servicename=srvcname, vendorname=vndrname, ) # 仅当本次预约日期为当日时,更新关联的时间段状态为False if bkngdate == datetime.date.today(): bkngtime.status = False bkngtime.save(update_fields=['status']) return Response('token registered')
可选优化点
- 增加参数校验:对传入的用户、时间段、服务、商家ID做存在性校验,ID不存在时返回400错误,避免直接抛出服务器异常
- 增加重复预约校验:如果当日对应时间段已经被标记为False,直接返回「该时间段已被预约」的提示,避免重复写入
- 日期解析兼容:如果前端传的日期格式不是
%Y-%m-%d,调整strptime的匹配规则即可,也可以通过DRF的序列化器自动做日期格式转换,减少手动解析的报错概率
内容的提问来源于stack exchange,提问作者IggyBugs
相关产品推荐
相关产品推荐

