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?
解答
不推荐也不建议对res.partner使用原型继承
res.partner内部包含大量指向自身的关联字段(比如commercial_partner_id、parent_id等),这些字段的目标模型被硬编码为res.partner。当你通过原型继承创建新模型my.partner.ext时,这些关联字段并不会自动适配为指向新模型,保存时会出现模型类型不匹配的错误(就像你遇到的commercial_partner_id赋值错误)。正确的扩展方式:普通继承(仅用_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
相关产品推荐
相关产品推荐

