You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:21:23