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

Odoo 10中如何实现自动计算当前日期与指定日期天数差的计算字段?

没问题,我来帮你完善这段代码,完美实现计算当前日期与到期日(maturity_date)剩余天数的需求。先指出你代码里的几个小问题,再给出完整的可运行代码:

关键修正点

  1. Odoo日期字段无需字符串转换:如果你的maturity_date是用fields.Date定义的,它本身就是Python的date对象,不需要用strptime做字符串转日期的操作
  2. 用Odoo内置方法获取当前日期:fields.Date.today()会适配系统时区,比直接用datetime.datetime.now().date()更符合Odoo的开发规范
  3. 批量记录处理:compute函数可能同时处理多条记录,必须遍历self来逐个计算,避免批量操作时出错
  4. 负数天数处理:如果到期日已经过去,天数差会是负数,这里可以根据需求设为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:31:16