Odoo 为什么相关字段使用写函数

Odoo 为什么相关字段使用写函数,odoo,odoo-12,Odoo,Odoo 12,对“building”和“building.floor”表具有读取权限的用户尝试在“my.table”中创建记录。如果用户同时选择building\u id和floor\u id,则会发生错误。错误表示我的用户无权写入“building.floor”表。我的问题是:为什么相关字段使用write函数,在这种情况下,compute和related之间有什么区别?相关字段是非常简单的计算字段。非常简单,它们可以通过字段定义上的一个参数“实现”。Odoo为这些字段提供了通用方法。例如,许多开发人员不为计

对“building”和“building.floor”表具有读取权限的用户尝试在“my.table”中创建记录。如果用户同时选择building\u id和floor\u id,则会发生错误。错误表示我的用户无权写入“building.floor”表。我的问题是:为什么相关字段使用write函数,在这种情况下,compute和related之间有什么区别?

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

相关字段具有通用的反向方法。在您更改
building\u id
的情况下,当已经选择了
floor\u id
时,Odoo将在该
floor\u id.building\u id
上写入
building\u id
,因为相关字段就是这样工作的(我知道这不是最好的解释)

用户显然对
building.floor
model没有写入/更新权限,这就是为什么最终会出现访问错误消息,因为Odoo希望在地板上写入新建筑

在我看来,您希望按建筑物过滤楼层,但不应使用相关字段。只需在
floor\u id
上放置一个域,该域按所选
building\u id
进行过滤:

floor\u id=fields.manyOne('building.floor',domain=“[('building\u id','=?',building\u id)])

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

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

相关字段具有通用的反向方法。在您更改
building\u id
的情况下,当已经选择了
floor\u id
时,Odoo将在该
floor\u id.building\u id
上写入
building\u id
,因为相关字段就是这样工作的(我知道这不是最好的解释)

用户显然对
building.floor
model没有写入/更新权限,这就是为什么最终会出现访问错误消息,因为Odoo希望在地板上写入新建筑

在我看来,您希望按建筑物过滤楼层,但不应使用相关字段。只需在
floor\u id
上放置一个域,该域按所选
building\u id
进行过滤:

floor\u id=fields.manyOne('building.floor',domain=“[('building\u id','=?',building\u id)])
您也可以使用域运算符
=
,但是
=?
将在尚未设置建筑时显示所有楼层

    _name = "my.table"

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