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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 16:09:01