1

当我从此字段(下面的代码)编辑记录时,由于某种原因它没有保存。它是一个计算字段,链接到 res.partner 记录。如果我编辑它并单击保存,它根本不会保存(数据库中没有更改和/或如果我硬刷新页面)。有人在这里看到我想念的东西吗?如果我无法通过我所期望的方式对其进行编辑,是否还有另一种方法可以做到这一点?我在 child_ids 上做一个计算字段而不是一个域的原因是因为带有域的 child_ids 字段似乎不适用于该域。

模型

contact_ids = fields.One2many(comodel_name='res.partner', compute="_get_contact_ids", readonly=False)

@api.multi
@api.depends('child_ids')
def _get_contact_ids(self):
    for company in self:
        if company.child_ids:
            company.contact_ids = company.child_ids.search([('is_location', '=', False), ('parent_id', '=', company.id), ('type', '=', 'contact')])

看法

<field name="contact_ids" string="Contacts">
    <tree create="true" delete="false" edit="true" default_order="create_date">
        <field name="name"/>
        <field name="phone"/>
        <field name="email"/>
    </tree>
</field>

更新

根据想法添加了这个,但它没有用。请记住,这是在继承 res.partner 的模型上。

activity_contact_id = fields.Many2one('res.partner', string="Contact")
contact_ids = fields.One2many(
    comodel_name='res.partner',
    inverse_name='activity_contact_id',
    compute="_get_contact_ids",
    readonly=False,
    stored=True
)
4

2 回答 2

1

Odoo 中的计算字段默认不存储,您需要设置 store=True 才能将字段保存到数据库。

contact_ids = fields.One2many(comodel_name='res.partner', compute="_get_contact_ids", stored=True, readonly=False)
于 2018-03-27T00:05:16.073 回答
1

要将one2many值存储在数据库中,您需要inverse_name另一个model. 我的意思是您需要创建一个many2one字段来将id当前记录保存在co_model. (o2m 需要 m2o,没有 m2o 就无法存储值!!记住这个角色)

不要使用one2many字段使用many2many字段更好。

   contact_ids = fields.Many2many(comodel_name='res.partner',
                                  relation="your_model_res_partner_rel", # always mention the name of the relation good practice
                                  column1 = "you_mode_id",
                                  column2 = "partner_id",
                                 compute="_get_contact_ids",
                                 store=True) # make your field stored no need for readonly it's by default

   @api.depends('child_ids')
   def _get_contact_ids(self):
        """ always explain what the method do here good practice for team work"""
        for company in self:
            if company.child_ids:
                # break you line when it's to long to be readable
                ids = company.child_ids.search([('is_location', '=', False),
                                                ('parent_id', '=', company.id),
                                                ('type', '=', 'contact')]).ids
                company.contact_ids = [(6, False, ids)] # replace all records by the new ids
于 2018-03-27T19:43:30.380 回答