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

Django Model内定义的计算逻辑不更新,需重启服务器才生效如何解决

问题根源

你当前的问题并不是缓存导致的,核心原因是你把latest_rate的赋值逻辑写在了模块顶层:Django服务启动时会一次性加载所有模块内的代码,这两行查询逻辑只会在项目启动时执行一次,拿到的是启动时刻的汇率值,后续除非重启服务,这个全局变量的值不会自动更新。如果你的服务采用多worker部署,还会出现不同worker启动时间不同、拿到的汇率不一致的问题,导致同一份数据计算结果不同。

最优解决方案

因为汇率每周仅更新一次,数据库查询压力极低,直接在每次调用计算属性时实时查询即可,完全可以满足业务需求:

  1. 删除模块顶层的这两行代码:
V = Hedge_rate.objects.all().first()
latest_rate = V.Hedge_rate
  1. 修改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内置缓存组件使用:

  1. 封装汇率读取工具函数,自动走缓存:
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
  1. 修改计算属性调用工具函数:
@property
def spot_amount(self):
    return self.usd_amount / get_latest_hedge_rate()
  1. 汇率更新时主动清空缓存:有两种实现方式,二选一即可
  • 在汇率提交的视图逻辑中,更新完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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:15:03