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

Django表单选择时间与数据库存储不一致问题排查

问题根源

你的代码核心问题出在save方法的逻辑上——它会强制覆盖用户选择的时间:

在新增预订(即self.pk不存在时)的代码段中:

if not self.pk:
    available_times = [choice[0] for choice in self.TIME_CHOICES]
    booked_times = Booking.objects.filter(meal_day=self.meal_day).values_list('meal_time', flat=True)
    available_times = [time for time in available_times if time not in booked_times]
    if available_times:
        self.meal_time = available_times[0]  # 这里直接替换了用户提交的时间
    else:
        raise ValidationError("No available time slots for the selected day.")

不管用户通过表单选择了哪个时间,这段代码都会把meal_time强制设置为当天第一个可用时段,完全忽略用户的选择,这就是数据库存储时间和表单提交不一致的原因。

修复方案

根据你的需求,有两种优化方向:

方向1:尊重用户选择,仅在选定时段不可用时自动分配

保留用户的时间选择,只有当用户选的时段已被占用时,才自动分配第一个可用时间:

def save(self, *args, **kwargs):
    if not self.pk:
        booked_times = Booking.objects.filter(meal_day=self.meal_day).values_list('meal_time', flat=True)
        # 检查用户选择的时间是否被占用
        if self.meal_time in booked_times:
            available_times = [choice[0] for choice in self.TIME_CHOICES if choice[0] not in booked_times]
            if available_times:
                self.meal_time = available_times[0]
            else:
                raise ValidationError("No available time slots for the selected day.")
    super().save(*args, **kwargs)

方向2:移除强制分配逻辑,依赖clean方法的验证

你的clean方法已经实现了"时段冲突则报错"的逻辑,完全可以直接移除save里的强制分配代码,让用户明确知道自己选的时段不可用:

def save(self, *args, **kwargs):
    # clean方法会在保存前触发,若时间冲突会直接抛出错误阻止保存
    super().save(*args, **kwargs)

这种方式更清晰,用户不会遇到"选了A却存了B"的困惑,而是会收到明确的错误提示。

内容的提问来源于stack exchange,提问作者Con1234

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:41:21