Django Model内定义的计算逻辑不更新,需重启服务器才生效如何解决
问题根源
你当前的问题并不是缓存导致的,核心原因是你把latest_rate的赋值逻辑写在了模块顶层:Django服务启动时会一次性加载所有模块内的代码,这两行查询逻辑只会在项目启动时执行一次,拿到的是启动时刻的汇率值,后续除非重启服务,这个全局变量的值不会自动更新。如果你的服务采用多worker部署,还会出现不同worker启动时间不同、拿到的汇率不一致的问题,导致同一份数据计算结果不同。
最优解决方案
因为汇率每周仅更新一次,数据库查询压力极低,直接在每次调用计算属性时实时查询即可,完全可以满足业务需求:
- 删除模块顶层的这两行代码:
V = Hedge_rate.objects.all().first() latest_rate = V.Hedge_rate
- 修改
spot_amount计算属性的逻辑,实时拉取最新汇率:
@property def spot_amount(self): # 可自行补充Hedge_rate表为空时的兜底逻辑,避免报错 latest_rate = Hedge_rate.objects.all().first().Hedge_rate return self.usd_amount / latest_rate
可选优化方案(适配请求量较大的场景)
如果你的服务请求量极高,需要避免每次计算都查数据库,可以搭配Django内置缓存组件使用:
- 封装汇率读取工具函数,自动走缓存:
from django.core.cache import cache def get_latest_hedge_rate(): rate = cache.get("latest_hedge_rate") if not rate: rate_obj = Hedge_rate.objects.first() if rate_obj: rate = rate_obj.Hedge_rate # 缓存不设过期时间,仅在汇率更新时主动清空 cache.set("latest_hedge_rate", rate, timeout=None) # 可自行补充表为空时的兜底值 return rate
- 修改计算属性调用工具函数:
@property def spot_amount(self): return self.usd_amount / get_latest_hedge_rate()
- 汇率更新时主动清空缓存:有两种实现方式,二选一即可
- 在汇率提交的视图逻辑中,更新完
Hedge_rate数据后,主动执行缓存删除:
from django.core.cache import cache # 你的表单提交、汇率更新逻辑执行完成后 cache.delete("latest_hedge_rate")
- 给
Hedge_rate模型绑定post_save信号,只要模型数据有变更就自动清缓存:
from django.db.models.signals import post_save from django.dispatch import receiver from django.core.cache import cache @receiver(post_save, sender=Hedge_rate) def clear_hedge_rate_cache(sender, instance, **kwargs): cache.delete("latest_hedge_rate")
内容的提问来源于stack exchange,提问作者OperGo
相关产品推荐
相关产品推荐

