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

Odoo中使用create_date自动字段计算其他字段遇问题求助

问题:使用Odoo自动字段create_date计算字段值时的报错处理

正在学习Odoo文档第9章,想要使用自动字段create_date来计算另一个字段的值,以下是模型代码:

_name = "estate.offer"
_description = "this is work as a offer offered to our real estate model"
_log_access = True
price = fields.Float()
status = fields.Selection(selection=[('accepted', 'Accepted'), ('refused', 'Refused')], copy=False)
partner_id = fields.Many2one("res.partner", string="Partner", required=True)
property_id = fields.Many2one("estate.model", 'offer_id', required=True)
validity = fields.Integer(compute="_inverse_date_deadline", inverse="_compute_date_deadline")
date_deadline = fields.Date(string="Date Deadline", compute="_compute_date_deadline",
                            inverse="_inverse_date_deadline")

api.depends('create_date', 'validity')
def _compute_date_deadline(self):
    for record in self:
        record.date_deadline = record.create_date + datetime.timedelta(days=record.validity)

# problem in this function
api.depends('create_date', 'date_deadline')
def _inverse_date_deadline(self):
    #print('f ddd {5} xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzxxxxxxxxx')
    for record in self:
        record.validity = (record.date_deadline - record.create_date).days

在_inverse_date_deadline函数中遇到问题,Odoo文档给出提示:

提示:create_date仅在记录创建时才会被赋值,因此你需要设置一个回退机制来避免创建记录时程序崩溃。


解决方案

记录创建阶段create_date尚未生成,直接执行日期减法运算会触发错误。同时create_date是datetime类型,date_deadline是date类型,直接相减会有类型不匹配问题,修改后的函数如下:

api.depends('create_date', 'date_deadline')
def _inverse_date_deadline(self):
    for record in self:
        # 空值判断+类型转换,避免创建时崩溃
        if record.create_date and record.date_deadline:
            record.validity = (record.date_deadline - record.create_date.date()).days
        else:
            record.validity = 0

内容的提问来源于stack exchange,提问作者Elfadil Sulieman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:05:21