重写 ORM 的默认方法

来自Odoo大V社-odoo中文开发手册
7017511讨论 | 贡献2017年12月26日 (二) 08:38的版本

(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

我们已经了解了API所提供的标准方法,但是这些方法并没有结束!我们还可以扩展它们,以向我们的模型添加自定义行为。

最常见的情况是扩展create()和write()方法。这可以用于添加在执行这些操作时触发的逻辑。通过将我们的逻辑放在适当部分中的自定义方法,我们可以在执行主操作之前或之后运行代码。

使用TodoTask模型作为示例,我们创建一个定制的create(),它看起来是这样的:︰

@api.model
def create(self, vals):
    # Code before create: can use the `vals` dict
    new_record = super(TodoTask, self).create(vals)
    # Code after create: can use the `new_record` created
    return new_record
 

自定义write()将遵循以下结构︰

@api.multi 
def write(self, vals): 
    # Code before write: can use `self`, with the old values     
   super(TodoTask, self).write(vals) 
    # Code after write: can use `self`, with the updated values     
   return True 
 

这些都是常见的扩展示例,但当然,任何用于模型的标准方法都可以以类似的方式继承,以将我们的自定义逻辑添加到该模型中。

这些技术为您提供了许多可能性,但是请记住,其他工具也可以更适合于常见的特定任务︰

 要有一个基于另一个字段值的字段值,我们应该使用计算字段。这样做的一个例子是,当改变行值时,计算一个标题总数。

 要有动态计算的字段缺省值,我们可以使用字段缺省值绑定到函数而不是固定值。

 要在字段被更改时设置其他字段的值,我们可以在更改函数上使用。例如,在选择客户时,将其货币设置为文档的货币,稍后可以由用户手动更改。请记住,更改只在表单视图交互中工作,而不是直接写调用。

 对于验证,我们应该使用修饰过的约束函数

@api.constraints(fld1,fld2,…)。这些字段类似计算字段,但它们代替计算值会引起错误。 

上一节:装饰器方法 下一节:RPC和Web客户端调用的方法