为什么相关字段要使用Write函数

Why related fields use Write function

    _name = "my.table"

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

具有 'building' 和 'building.floor' table 读取权限的用户尝试在 "my.table" 中创建记录 如果用户选择 building_id和 floor_id 一起发生错误。该错误表明我的用户无权写入 'building.floor' table。我的问题是:为什么related field要用write函数,这个场景下compute和related有什么区别?

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

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

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

在我看来你想按建筑物过滤楼层,但你不应该为此使用相关字段。只需在 floor_id 上放置一个域,该域按所选 building_id:

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

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