为什么相关字段要使用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)]")
您也可以使用域运算符 =
,但是 =?
将在尚未设置建筑物时显示所有楼层。
_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)]")
您也可以使用域运算符 =
,但是 =?
将在尚未设置建筑物时显示所有楼层。