Odoo继承有3种方式:

一、类继承,(基本继承,经典继承,不会生成新的表,所有的修改都在原有的模型中体现)

class TodoTask(models.Model):
    _name = 'todo.task'                      #可以省略                   
    _inherit = 'todo.task'                   #使用_inherit关键字继承'todo.task'模型
    budget = fields.Float(string=u'预算')    #budget为新模型新增的字段
   扩展类中没有_name属性,因为它继承了父类的_name。对现有模型的扩展, 添加新功能,都将添加到现有模型中,
不会创建新模型。 因此,在odoo中,根据_name唯一确定这个模型时找到的就是扩展后的类。(如上面添加字段是类继承)

二、原型继承(相当于复制原有的模型,生成新的表)

class TodoTask(models.Model):
   _name = 'todo.task_v1'               #不可以省略
   _inherit = 'todo.task'               #使用_inherit关键字继承'todo.task'模型
   budget = fields.Float(string=u'预算') #budget为新模型新增的字段

         我们想使用具有不同于父模型的值的_name属性,我们将获得一个新模型重用来自继承的特性,但是具有自己的数据库表和数据。其实就是把继承的类的功能特性拷贝给新的模型使用,并不改变被继承模型。

          复制意味着被继承的方法和字段也将在继承模型中可用。 对于字段,这意味着它们也将被创建并存储在目标模型的数据库表中。 原始(继承)和新(继承)模型的数据记录保持不相关,只有定义是共享的。

 

三、委托继承()

class NewModel():
    _name = "new.model"
    _inherits = {'模型1': '关联字段1','模型2': '关联字段2'}

          使用_inherits属性,它允许一个模型以透明的方式包含其他模型。通过字典映射继承模型与字段的关系,并关联它们

          通俗解释:(相当于成员变量:引用一个外部的类对象赋值给这个模型的一个成员,但是对象的值是保存在被引用的类的数据库表中的。但是在当前类通过成员修改了变量值,则会同步到被引用的类的数据库表中)

          优点是不需要在几个表之间重复数据结构,例如地址。 任何需要包含地址的新模型都可以将其委派给嵌入式合作伙伴模型。 如果在合作伙伴地址字段中引入了修改,则这些修改会立即提供给嵌入它的所有模型!

02-11 23:29