Odoo - 如何从 parent_id 设置字段值?

Odoo - How to set field value from parent_id?

我正在制作一个向合作伙伴表单添加额外字段的模块。由于合作伙伴公司的价值相同,因此公司的所有员工都必须相同。

成功写入代码复制到child_usrs:

问题是我无法再编辑该字段...

我的代码:

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

spg_mov = fields.Char(string='MOV', compute='_compute_mov_from_parent', help='Minimum Order Value')
@api.one
@api.depends('parent_id', 'parent_id.spg_mov')
def _compute_mov_from_parent(self):
    if self.parent_id:

        self.spg_mov = self.parent_id.spg_mov

    elif type(self.id) is not models.NewId:
        query = """
        SELECT
            spg_mov
        FROM res_partner
        WHERE id=%s"""
        self.env.cr.execute(query, [self.id])
        result = self.env.cr.dictfetchone()

        self.spg_mov = result['spg_mov']



@api.one
def _inverse_persist_fields(self):
    query = """
    UPDATE res_partner
    SET
        spg_mov=%s
    WHERE id=%s"""

    params = [SpgMovField._optional(self.spg_mov)]
    self.env.cr.execute(query, params)
    self.env.invalidate_all()

@api.model
@api.onchange('parent_id')
def onchange_parent_id_new_mov(self):
    old_res = super(SpgMovField, self).onchange_parent_id(self.parent_id.id)
    _LOGGER.info(repr(old_res))
    if type(old_res) is dict and 'value' in old_res:
        for field, value in old_res.get('value').items():
            if hasattr(self, field):
                setattr(self, field, value)

    if self.parent_id:
        fields_to_copy = ['spg_mov']

        for key in fields_to_copy:
            self[key] = self.parent_id[key]

@staticmethod
def _optional(condition, value = None, defaultValue = None):
    if value is None:
        value = condition
    return value if condition != False else defaultValue

一个简单的解决方案是使用 Odoo 的商业领域逻辑:

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

    my_field1 = fields.Char()
    my_field2 = fields.Char()

    @api.model
    def _commercial_fields(self):
        """ Returns the list of fields that are managed by the commercial entity
        to which a partner belongs. These fields are meant to be hidden on
        partners that aren't `commercial entities` themselves, and will be
        delegated to the parent `commercial entity`. The list is meant to be
        extended by inheriting classes. """
        commercial_fields = super(ResPartner, self)._commercial_fields()
        new_commercial_fields = ['my_field1', 'my_field2']
        commercial_fields.extend(new_commercial_fields)
        return commercial_fields