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

使用timedelta判断Django模型是否最近更新失败问题

解决StockInfo模型更新时间判断的时区与逻辑问题

问题根源

  1. 时间差计算顺序错误:你用last_updated_time - now,如果最后更新时间早于当前时间,结果必然为负数,导致后续判断逻辑完全颠倒。
  2. 时区不统一:你移除了last_updated_time的时区信息,但未确保now的时区与之匹配,跨时区场景下会出现诸如-1 day, 23:59:31.335919的异常差值。

修正方案

1. 统一时区(推荐用Django内置工具)

Django的timezone.now()会自动使用项目配置的时区,和你save方法中datetime.datetime.now().astimezone()的时区一致,避免时区偏差。优化后的模型save方法:

from django.utils import timezone

class StockInfo(models.Model):
    ticker = models.CharField(max_length=100)
    current_price = models.FloatField()
    name = models.CharField(max_length=255)
    summary = models.TextField()
    sector = models.CharField(max_length=100)
    dividends = models.ArrayField(model_container=Dividend)
    last_updated_time = models.DateTimeField(null=True)

    objects = models.DjongoManager()

    def save(self, *args, **kwargs):
        self.last_updated_time = timezone.now()  # 统一使用带时区的当前时间
        super(StockInfo, self).save(*args, **kwargs)

2. 修正时间判断逻辑

计算当前时间与最后更新时间的差值,判断该差值是否小于等于1分钟,逻辑更直观且准确:

from django.utils import timezone

now = timezone.now()
# 先判断last_updated_time是否存在,避免空值报错
if stock.last_updated_time:
    time_since_update = now - stock.last_updated_time
    if time_since_update <= timezone.timedelta(minutes=1):
        print("股票信息最近1分钟内更新过")
    else:
        print("股票信息需要重新请求API")
else:
    # 首次创建或从未更新,直接发起API请求
    print("股票信息未更新,立即获取")

关键说明

  • 始终使用带时区的时间进行计算,避免因时区偏移产生的异常差值
  • 时间差计算方向为当前时间 - 最后更新时间,得到的差值为非负数,判断逻辑更清晰
  • 增加空值判断,覆盖模型首次创建时last_updated_time为null的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:24:28