Odoo 10中如何实现自动计算当前日期与指定日期天数差的计算字段?
没问题,我来帮你完善这段代码,完美实现计算当前日期与到期日(maturity_date)剩余天数的需求。先指出你代码里的几个小问题,再给出完整的可运行代码:
关键修正点
- Odoo日期字段无需字符串转换:如果你的
maturity_date是用fields.Date定义的,它本身就是Python的date对象,不需要用strptime做字符串转日期的操作 - 用Odoo内置方法获取当前日期:
fields.Date.today()会适配系统时区,比直接用datetime.datetime.now().date()更符合Odoo的开发规范 - 批量记录处理:compute函数可能同时处理多条记录,必须遍历
self来逐个计算,避免批量操作时出错 - 负数天数处理:如果到期日已经过去,天数差会是负数,这里可以根据需求设为0或者保留负数
完整代码
from odoo import models, fields, api class YourModel(models.Model): _name = 'your.model.name' # 替换成你的实际模型名称 _description = 'Your Model Description' # 先确保你的到期日字段是Date类型 maturity_date = fields.Date('Maturity Date') days_number = fields.Integer( 'Days remaining', compute='_compute_remaining_days', store=True ) @api.depends('maturity_date') def _compute_remaining_days(self): current_date = fields.Date.today() # 遍历每条记录,处理批量场景 for record in self: if record.maturity_date: # 日期直接相减得到timedelta对象,取days属性 delta = record.maturity_date - current_date # 可选:如果到期日已过,将剩余天数设为0,否则保留实际差值 record.days_number = delta.days if delta.days >= 0 else 0 else: # 没有设置到期日时的默认值,可根据需求修改 record.days_number = 0
额外说明
- 如果设置了
store=True,这个计算字段的值会存在数据库里,只有当maturity_date变化时才会重新计算。如果需要每天自动更新剩余天数,可以把store改为False(每次访问字段都会实时计算),或者配合Odoo的定时任务(ir.cron)每天触发一次计算。 - 如果你之前的
maturity_date是字符串类型,那需要先把它改成fields.Date类型,否则转换逻辑要调整,但不建议这么做,Odoo有专门的日期字段类型来处理这类场景。
内容的提问来源于stack exchange,提问作者bjr_tlb
相关产品推荐
相关产品推荐

