OPENERPHKOdoo的几种继承
0
对于外行的Odoo继承
复杂的技术看起来像魔术。当你长时间使用它时,魔法可以成为第二天性,它可以成为“它的工作方式”。但是当涉及到计算机时,我不喜欢魔法。特别是在使用Pyt
对于外行的Odoo继承
复杂的技术看起来像魔术。当你长时间使用它时,魔法可以成为第二天性,它可以成为“它的工作方式”。但是当涉及到计算机时,我不喜欢魔法。特别是在使用Python构建的系统中,其Zen包含Explicit比隐式更好。
我几乎没有开始使用Odoo(以前的OpenERP),其中最令我印象深刻的一点就是它的继承机制。我阅读了文档,与我的高级同事交谈并大量浏览了代码。我想从初学者的角度记录我的发现,然后魔术成为“它的工作方式”。
三种继承模式
Odoo提供了三种继承和扩展现有模型的方法。我们将逐一检查它们,为了消除魔法,我们将看到幕后发生的事情。
首先,让我们看看所有继承模式的共同点。在标准Python意义上,从Odoo中定义您继承的新模型models.Model,如下所示:
class Polygon(models.Model): _name = 'shapes.polygon' pos_x = fields.Float(default=0) pos_y = fields.Float(default=0)
模型成为Odoo数据库中的表。该_name属性是如何在Odoo中识别您的模型,并且它是Odoo从中派生表名的位置。安装包含上述模型的模块后,您将在pgAdmin中看到以下内容:
注意如何pos_x与pos_y显示为表中的列shapes_polygon和Odoo如何自动创建五个额外的领域。
模式一:经典继承
在Odoo中扩展模型的第一种方法在精神上类似于其他编程语言中的原型继承。您想要定义新模型,但是您希望重用现有模型的字段和方法。你在Odoo中实现了这样:
class Rectangle(models.Model): _name = 'shapes.rectangle' _inherit = 'shapes.polygon' width = fields.Float(default=0) height = fields.Float(default=0)
这里的关键属性是_inherit。在此处指定要用作新模型原型的现有模型。您的模型获取其基本模型的所有字段,甚至可以使用,重新定义和访问基本方法super()。
通过此继承,Odoo在数据库中创建了一个新表,并包含继承模型的所有列。在pgAdmin中看起来像这样:
模式二:扩展
在此模式下,您不会创建新模型。要扩展现有模型到位。这使得不仅可以添加字段和方法,还可以重新定义现有字段和方法。这样,您的更改可能会对模型的所有当前用户产生影响。Odoo和第三方模块经常使用它。
语法实际上非常简单:包含_inherit属性但省略 _name,如下所示:
class DescriptivePolygon(models.Model): _inherit = 'shapes.polygon' description = fields.Char() pos_x = fields.Float(string="X", default=0) pos_y = fields.Float(string="Y", default=0)
下一篇:很抱歉没有了