如何用Django开发配送时段预约系统并设计对应数据库模型
Django配送时段预约系统实现方案
一、模型优化设计
你原有的拆分Date、Time两张表的设计会增加连表查询的开销,也缺少核心的占用状态标记,优化后的单表设计更适合当前需求:
from django.db import models from django.conf import settings # 可替换为你自己的订单模型 class Order(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) # 其余订单自定义字段省略 class DeliveryTimeSlot(models.Model): date = models.DateField(verbose_name="配送日期") time_slot = models.TimeField(verbose_name="配送时段") is_booked = models.BooleanField(default=False, verbose_name="是否已被预约") booked_order = models.ForeignKey(Order, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="关联预约订单") class Meta: # 保证同一个日期同一个时段只会生成一条记录 constraints = [ models.UniqueConstraint(fields=['date', 'time_slot'], name='unique_date_timeslot') ] # 新增联合索引大幅提升查询效率 indexes = [ models.Index(fields=['date', 'is_booked']), ]
二、核心功能实现逻辑
- 时段预生成:提前批量生成未来可预约周期内的所有可选时段,比如未来15天内每天的9:00、10:00、11:00等可预约时段,初始化时
is_booked默认设为False。 - 预约防重逻辑:用户选中时段提交订单时,使用
select_for_update()加行锁查询对应时段的状态,避免并发请求导致的超卖:如果is_booked为False则将其改为True,同时绑定当前订单;如果已为True直接返回「该时段已被预约,请选择其他时段」的提示。 - 前端展示逻辑:用户打开预约页时,查询对应日期范围内所有时段,根据
is_booked字段标记对应时段是否禁用即可,不同日期的相同时段互不影响,完全匹配需求。
三、性能说明
该设计所有查询均为单表过滤,配合联合索引,即使未来有数十万条时段记录,查询响应速度也能满足业务需求,远高于原有两表关联的设计效率。
内容的提问来源于stack exchange,提问作者Mahian Mahin
相关产品推荐
相关产品推荐

