使用timedelta判断Django模型是否最近更新失败问题
解决StockInfo模型更新时间判断的时区与逻辑问题
问题根源
- 时间差计算顺序错误:你用
last_updated_time - now,如果最后更新时间早于当前时间,结果必然为负数,导致后续判断逻辑完全颠倒。 - 时区不统一:你移除了
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
相关产品推荐
相关产品推荐

