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

Odoo8 auto count days field 打开页面未自动更新问题咨询

问题根因

你当前实现的问题核心是store=True的存储型计算字段触发逻辑限制:Odoo中落库存储的计算字段,仅会在@api.depends装饰器声明的依赖字段值发生变更时触发重算。你仅声明了依赖date_hpp_start字段,自然只有修改该字段值时才会更新天数。
而间隔天数依赖实时变化的当前日期,你无法将"当前日期"声明为字段依赖,因此存储型字段无法自动随时间推移自动更新值。

推荐实现方案(无存储,实时计算)

如果你的业务不需要基于Interest Age (days)字段做数据库层面的搜索、分组、复杂统计,直接去掉store=True配置即可——非存储的计算字段默认每次读取记录(打开表单、加载列表视图)时都会实时执行计算,完全满足打开页面自动更新天数的需求,且日期计算性能开销极低,不会影响页面加载速度。
优化后的完整代码如下:

from odoo import models, fields, api
import datetime

class YourBusinessModel(models.Model):
    # 替换为你实际的模型名
    _name = "your.business.model"

    date_hpp_start = fields.Date(string="HPP Date start")

    @api.multi
    @api.depends('date_hpp_start')
    def _compute_difference(self):
        # 把当日日期提取到循环外,避免重复取值
        current_today = datetime.date.today()
        for rec in self:
            if rec.date_hpp_start:
                # Odoo的Date字段读取后原生就是Python date对象,无需手动strptime转换
                rec.days_difference = (current_today - rec.date_hpp_start).days
            else:
                rec.days_difference = 0

    # 移除store=True,默认即为非存储实时计算字段
    days_difference = fields.Integer(string='Interest Age (days)', compute=_compute_difference)
特殊场景方案(需存储字段时)

如果业务要求必须将天数字段落库(比如需要做数据库级搜索、报表聚合统计),仅靠计算字段逻辑无法实现自动更新,需要搭配每日定时任务批量重算:

  1. 保留字段的store=True配置
  2. 新增定时执行的公共方法,每日批量刷新所有有效记录的天数值
    对应补充代码如下:
@api.model
    def _cron_refresh_interest_age_daily(self):
        # 搜索所有配置了起始日期的记录,批量触发计算
        valid_records = self.search([('date_hpp_start', '!=', False)])
        valid_records._compute_difference()
        return True
  1. 进入Odoo后台「技术-自动化-定时任务」菜单,新建定时任务,配置项如下:
    • 对应模型选择你的业务模型
    • 执行方法选择_cron_refresh_interest_age_daily
    • 执行间隔设置为1天,触发时间选凌晨业务低峰时段即可
      这样每天库内存储的天数都会自动更新为最新值,打开页面时读取的就是当日计算好的最新数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:09:32