修改模型的方法

来自Odoo V
跳转至: 导航搜索

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

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

小窍门

最好避免更改方法的函数签名(即保持相同的参数),以确保与其关联的现有调用继续正常工作。如果需要添加其他参数,请将它们作为可选的关键字参数(使用默认值)。

原始的“全部完成”操作不再适用于我们的任务共享模块,因为它清除所有任务,而不管其用户。我们需要修改它,以便它只清除当前用户任务。

为此,我们将使用新版本重写(或替换)原始方法,首先查找当前用户的已完成任务的列表,然后停止它们的活动:

 @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(&)运算符隐式连接。对于OR操作,符号| 作为联通管道,用于替换元组,并且它加入接下来的两个条件。我们将在第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.multi 
 def do_toggle_done(self): 
     for task in self: 
         if task.user_id != self.env.user: 
             raise ValidationError(
                 'Only the responsible can do this!') 
     return super(TodoTask, self).do_toggle_done()

继承类中的方法以for循环开始,以检查任何要切换的任务都不属于另一个用户。如果这些检查通过,它然后继续调用父类方法,使用super()。如果没有提出错误,我们应该使用这个Odoo内置异常。与此处情况最相关的是ValidationErrorUserError

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

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