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

Odoo 17使用原型继承扩展res.partner报错问题咨询

Odoo 17中res.partner原型继承的问题与解答

问题场景

在Odoo 17中尝试通过原型继承(同时设置_name和_inherit)子类化res.partner模型,代码如下:

class MyPartnerExt(models.Model):
    _inherit = 'res.partner'
    _name = 'my.partner.ext'

    custom_id = fields.Integer()

保存该模型实例时触发如下异常:

File "/Users/markns/workspace/odoo/odoo/odoo/fields.py", line 3055, in convert_to_cache
    raise ValueError("Wrong value for %s: %r" % (self, value))
ValueError: Wrong value for my.partner.ext.commercial_partner_id: my.partner.ext(4,)

疑问:是否可以(或推荐)通过原型继承子类化res.partner?


解答

  1. 不推荐也不建议对res.partner使用原型继承
    res.partner内部包含大量指向自身的关联字段(比如commercial_partner_id、parent_id等),这些字段的目标模型被硬编码为res.partner。当你通过原型继承创建新模型my.partner.ext时,这些关联字段并不会自动适配为指向新模型,保存时会出现模型类型不匹配的错误(就像你遇到的commercial_partner_id赋值错误)。

  2. 正确的扩展方式:普通继承(仅用_inherit)
    如果只是要扩展res.partner的功能,添加字段或修改逻辑,只需要使用_inherit而不设置_name,直接在原模型上扩展,不会创建新模型,也不会出现关联字段的类型问题:

class ResPartner(models.Model):
_inherit = 'res.partner'

custom_id = fields.Integer()
3. **特殊场景的替代方案:委托继承**
   如果业务上确实需要一个独立的伙伴类,可以考虑使用**委托继承**(`_inherits`),但需要手动处理所有关联字段的映射,复杂度较高,仅推荐在有特殊业务需求时使用:
   ```python
class MyPartnerExt(models.Model):
    _name = 'my.partner.ext'
    _inherits = {'res.partner': 'partner_id'}

    partner_id = fields.Many2one('res.partner', required=True, ondelete='cascade')
    custom_id = fields.Integer()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 12:01:01