【问题标题】:Why related fields use Write function为什么相关字段使用Write函数
【发布时间】:2020-03-06 06:46:57
【问题描述】:
    _name = "my.table"

    building_id = fields.Many2one('building', related='floor_id.building_id', readonly=False)
    floor_id = fields.Many2one('building.floor')

对“building”和“building.floor”表具有读取权限的用户尝试在“my.table”中创建记录如果用户同时选择 building_id 和 floor_id,则会发生错误。该错误表明我的用户无权写入“building.floor”表。我的问题是:为什么一个相关领域使用 write 功能,在这种情况下计算和相关有什么区别?

【问题讨论】:

    标签: odoo odoo-12


    【解决方案1】:

    相关字段是非常简单的计算字段。如此简单,它们可以通过字段定义的一个参数“实现”。 Odoo 具有这些领域的通用方法。例如,很多开发人员不会为计算域编写逆向方法,因为它们根本不需要它。但是没有它并且不存储计算字段,Odoo 将字段设置为只读。

    相关字段有一个通用的逆方法。如果您在已经选择了floor_id 时更改building_id,Odoo 将在floor_id.building_id 上写入building_id,因为这就是相关字段的工作方式(我知道这不是最好的解释)。

    用户显然对builiding.floor模型没有写入/更新权限,这就是为什么最后会出现访问错误消息的原因,因为Odoo想在地板上写入新建筑物。

    在我看来,您想按建筑物过滤楼层,但您不应该为此使用相关字段。只需在floor_id 上添加一个域,该域会按所选的building_id 进行过滤:

    floor_id = fields.Many2one('building.floor', domain="[('building_id', '=?', building_id)]")
    

    您也可以使用域运算符=,但=? 将在尚未设置建筑物时显示所有楼层。

    【讨论】:

      猜你喜欢
      • 2019-06-12
      • 1970-01-01
      • 2021-09-22
      • 2022-11-25
      • 1970-01-01
      • 2016-12-19
      • 2011-04-22
      • 2011-10-04
      • 2021-06-30
      相关资源
      最近更新 更多