Odoo(openerp) 中@api.onchange 和@api.depends 的主要区别是什么?

What is Main difference between @api.onchange and @api.depends in Odoo(openerp)?

在 Odoo v8 中使用了很多 API 装饰器。但是我不明白 @api.depends@api.onchange 之间的主要区别。

谁能帮我解决这个问题?

谢谢。

@api.depends

这个装饰器专门用于odoo中的"fields.function"。对于 "field.function",您可以计算该值并将其存储在一个字段中,其中计算可能取决于相同 table 或其他 table 的某些其他字段,在这种情况下,您可以使用“@api.depends”在某些 table 的字段上保留 'watch'。

因此,如果装饰器中的任何字段是 'altered by ORM or changed in the form'.

,这将触发对装饰函数的调用

假设有一个 table 'A' 字段 "x,y & z" 和 table 'B' 字段 "p" ,其中 'p' 是 field.function,具体取决于 table 'A' 中的字段 'x',因此如果在字段 [=57= 中进行任何更改],会触发计算table'B'.

字段'p'的装饰函数

确保 table "A" 和 "B" 在某种程度上相关。

@api.onchange

如果装饰器中指定的任何字段在表单中发生更改,此装饰器将触发对装饰函数的调用。 此处范围仅限于同一屏幕/型号。

假设在表单上我们有字段 "DOB" 和 "Age",所以我们可以为 "DOB" 使用 @api.onchange 装饰器,只要您更改值的 "DOB",您可以计算 "age" 字段。

您可以在@api.depends 和@api.onchange 中找到相似之处,但一些不同之处在于 onchange 的范围仅限于相同的屏幕/型号,而 @api.depends 适用于其他相关屏幕/模型也。

有关详细信息,Here 是描述 Odoo v8 的所有 API 的 link。

@api.onchange 在虚拟记录中工作,这些记录上的分配不会写入数据库,只是用来知道将哪个值发送回客户端。

可以使用计算参数计算字段(而不是从数据库中读取),它必须将计算值分配给字段,它使用来自同一模型或其他模型的其他字段的值(不同于@api.onchange 仅适用于同一视图中的字段),它应使用 api.depends().

指定字段

了解更多信息。请查看我们的博客: https://odooforbeginnersblog.wordpress.com/2017/03/01/how-to-override-an-api-depends-decorated-method/

@api.depends

如果指定字段发生任何变化,将调用使用此装饰器定义的函数。此外,对字段的更改可以来自 ORM 或表单中的更改。此外,如果计算函数值依赖于另一个字段,则必须使用 depends.

指定它。

@api.onchange

这个装饰器的函数会在字段值改变的时候被调用。此外,它仅支持单个字段名称;相反,不会考虑诸如 parent_id.field_name 之类的带点的名称。此外,在包含表单值的伪记录上调用 onchange 方法。以下是相同的示例:

通过示例更好地理解参考:https://www.cybrosys.com/blog/method-decorators-odoo-13