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)
特殊场景方案(需存储字段时)
如果业务要求必须将天数字段落库(比如需要做数据库级搜索、报表聚合统计),仅靠计算字段逻辑无法实现自动更新,需要搭配每日定时任务批量重算:
- 保留字段的
store=True配置 - 新增定时执行的公共方法,每日批量刷新所有有效记录的天数值
对应补充代码如下:
@api.model def _cron_refresh_interest_age_daily(self): # 搜索所有配置了起始日期的记录,批量触发计算 valid_records = self.search([('date_hpp_start', '!=', False)]) valid_records._compute_difference() return True
- 进入Odoo后台「技术-自动化-定时任务」菜单,新建定时任务,配置项如下:
- 对应模型选择你的业务模型
- 执行方法选择
_cron_refresh_interest_age_daily - 执行间隔设置为1天,触发时间选凌晨业务低峰时段即可
这样每天库内存储的天数都会自动更新为最新值,打开页面时读取的就是当日计算好的最新数据。
内容的提问来源于stack exchange,提问作者Nur Faiz
相关产品推荐
相关产品推荐

