修改模型的方法

来自Odoo大V社-odoo中文开发手册
110799065讨论 | 贡献2018年3月3日 (六) 11:00的版本 小窍门

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

继承也在业务逻辑级别起作用。添加新方法很简单:只需在继承类中声明新的函数。

要扩展或更改现有逻辑,可以通过声明具有完全相同名称的方法来覆盖相应的方法。新方法将替换前一个方法,它也可以只是扩展继承类的代码,使用Python的super()方法来调用父方法。然后,可以在调用super()方法之前和之后,在原有逻辑周围添加新逻辑。

小窍门

最好避免改变方法的函数签名(也就是说,保留相同的参数),以确保与其关联的现有调用继续正常工作。如果您需要添加其他参数,请将它们作为可选的关键字参数(使用默认值,这样做的目的是为了在调用函数的时候,即使不给这些带默认值的参数传值,函数也可以自己填入默认值,从而不去改变函数的签名)。

继续,原来Clear All Done按钮完成的操作不再适合我们的任务共享(task-sharing)模块,因为它不区分用户的清除所有任务,我们准备修改它,以便它只清除当前的用户的任务。为了达到目的,我们重写Clear All Done按钮对应的函数即do_clear_done(),修改为以下逻辑,首先找到当前用户对应的所有用户列表,然后对所有任务进行去使能操作(停止任务的活动)。代码如下:

 @api.multi 
 def do_clear_done(self): 
     domain = [('is_done', '=', True), 
                '|', ('user_id', '=', self.env.uid), 
                     ('user_id', '=', False)] 
     dones = self.search(domain) 
     dones.write({'active': False}) 
     return True

为了清楚起见,我们首先构建要用于查找要清除记录的过滤器表达式。

这个过滤器表达式遵循称为domain的Odoo特定语法:它由条件组成的列表表示,其中每个条件是元组。

这些条件默认是用逻辑与(And)连接起来的,即条件需要同时成立,如果不是默认逻辑连接符号比如“|”符号(逻辑或),则运算操作符会影响到其后面的两个操作数(即采用波兰表达式)我们将在第6章-视图 - 用户界面设计这一章讨论更多关于域的细节。


此处域使用过滤将所有已完成的任务设置为('is_done','=',True),将仍有当前用户的情况设置为('user_id','=',self.env.uid),或将没有当前用户的情况设置为('user_id','=',False)

然后,我们使用search方法获取一个具有完成记录的记录集,并对其进行批量写入,将active字段设置为False。这里的Python False值表示数据库中的NULL值。

在这种情况下,我们完全重写了父方法,将其替换为一个新的实现方法,但这不是我们通常想要做的。相反,我们应该扩展现有的逻辑与一些额外的操作。否则,我们可能会破坏已经存在的功能。

为了使重写的方法保持已经存在的逻辑,我们使用Python的super()语句来调用父方法的版本。让我们看一个例子。

我们可以改进do_toggle_done()方法,以便它只对分配给当前用户的任务执行其操作。这是实现的代码:

 from odoo.exceptions import ValidationError  
 # ...
 # class TodoTask(models.Model):
 # ...
 @api.one
 def do_toggle_done(self):
   if self.user_id != self.env.user:
     raise Exception('Only the responsible can do this!')
   else:
     return super(TodoTask, self).do_toggle_done()

这些是重写和扩展模型类中定义的业务逻辑的基本技术。接下来,我们将了解如何扩展用户界面视图。

上一节:修改现有字段
下一节:扩展视图