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

时间:2015-02-02 03:11:12

标签: openerp odoo openerp-8

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

任何人都可以帮助我解决这个问题吗?

谢谢。

3 个答案:

答案 0 :(得分:37)

<强> @ api.depends

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

因此,如果装饰器中的任何字段被ORM '更改或以“”形式更改,则会触发对装饰函数的调用。

假设有一个表'A'表示字段“x,y&amp; z”,表'B'表示字段“p”,其中'p'表示字段。函数取决于字段'来自表'A'的x',所以如果在字段'x'中进行任何更改,它将触发用于计算表'B'中字段'p'的修饰函数。

确保表“A”和“B”在某种程度上相关。

<强> @ api.onchange

如果在窗体中更改了装饰器中指定的任何字段,则此装饰器将触发对装饰函数的调用。 此范围仅限于相同的屏幕/型号。

我们在表单上说我们有字段“DOB”和“Age”,所以我们可以为“DOB”设置@ api.onchange装饰器,只要你改变“DOB”的值,你就可以计算出“年龄“领域。

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

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:2)

@api.depends

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

@api.onchange

当字段值改变时会调用这个装饰器的函数。而且,它只支持单个字段名称;相反,将不考虑诸如 parent_id.field_name 之类的虚线名称。此外,在包含表单值的伪记录上调用 onchange 方法。下面是一个相同的例子:

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