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

Django模型进度计算函数如何在达到100%后停止计数

Django 事件进度计算固定上限实现方案

你原有的计算逻辑可以简化,同时新增两个边界判断即可实现进度超过100%后不再增长,还能避免除以零、当前时间早于开始时间返回负数的异常情况。

修正后的完整代码

from django.utils import timezone

def get_progress(self):
    # 已完成状态直接返回100%
    if self.status == 'Finished':
        return 100.0
    # 未开始状态直接返回0%
    if self.status == 'New':
        return 0.0
    now = timezone.now()
    # 边界判断:当前时间早于等于开始时间,返回0
    if now <= self.start_appointment:
        return 0.0
    # 边界判断:当前时间晚于等于结束时间,直接返回100,不会超过上限
    if now >= self.end_appointment:
        return 100.0
    # 计算总时长和已过时长
    total_duration = self.end_appointment - self.start_appointment
    # 处理开始结束时间相同的极端情况,避免除以0报错
    if total_duration.total_seconds() <= 0:
        return 100.0
    passed_duration = now - self.start_appointment
    progress = (passed_duration / total_duration) * 100
    return round(progress, 2) # 保留两位小数,可按需调整

逻辑说明

  • 优先做状态判断,Finished状态直接返回100%,New状态直接返回0%,不需要走时间计算逻辑,性能更高
  • 新增时间边界判断,只要当前时间超过结束时间就固定返回100%,自然不会出现进度超过100的情况
  • 简化了原有的进度计算公式,分母直接取预约的总时长,逻辑更清晰不易出错
  • 新增了除以零的异常处理,避免开始和结束时间设置为相同时代码报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:54:07