【问题标题】:Issue with editing Odoo 11 One2many computed field编辑 Odoo 11 One2many 计算域的问题
【发布时间】:2018-09-05 03:39:23
【问题描述】:

当我从该字段(下面的代码)编辑记录时,由于某种原因它没有保存。它是一个计算字段,链接到 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
)

【问题讨论】:

标签: odoo odoo-view odoo-11 one2many


【解决方案1】:

要将one2many 值存储在数据库中,您需要另一个model 上的inverse_name。 我的意思是你需要创建一个many2one字段来保存当前记录的idco_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

【讨论】:

  • 谢谢分享。我更新了我的代码(见更新)。尽管添加了反向名称,但它似乎不起作用。你碰巧看到我做错了什么吗?此外,如果 many2many 是要走的路 - 为什么会更好?
  • 这样更好,因为我不必在其他模型中创建 many2one,我可以在树视图中使用 many2many 小部件来显示数据。现在,当您更改 child_ids 时,one2many 字段会加载记录,而当您保存记录时,该字段将消失,或者无论您做什么,one2many 始终为空。
  • 并确保升级您的模块以在模型中添加新字段。您的代码应该可以工作
  • 感谢您的分享。我确实升级了我的模型,它仍然无法正常工作。澄清一下,这是在 res.partner 上的。通过执行“@api.depends('child_ids')”,我认为它只会在 child_ids 存在的情况下显示联系人(例如,如果 child_ids 中有一些记录)。我认为这与“更改 child_ids”无关——据我了解,这将是 onchange。也许 child_ids 是问题所在,我想完全删除它?
【解决方案2】:

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

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

【讨论】:

  • 谢谢,仅此一项似乎不起作用。我想知道这是因为它是一个计算字段,还是由于与 res.partner 的一些内部工作(我怀疑是前者)。如果我编辑记录、修改字段,然后保存并关闭(此字段的对话框),我可以重新打开它并看到更改。但是,如果我将父记录作为一个整体保存,然后重新打开该字段 - 它似乎没有保存它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 2019-06-18
  • 1970-01-01
相关资源
最近更新 更多