了解Odoo的ORM框架

       

             在刚开始学习如何定制Odoo 时,最常碰到的障碍之一,就是Odoo的ORM框架。ORM框架的用意在于,分离程序与数据库,让写程序的人可以不必担心数据库的数据结构,专注在程式逻辑上。但对于习惯直接存取数据库的程序员来说,这样的概念在一开始可能难以接受,需要花些时间才能理解。 这里就来告诉大家,什么是ORM,以及Odoo是如何呈现ORM的。

什么是ORM

          ORM是Object-Relational Mapping的缩写,中文可以翻译为“对象关系映射”,是一种程序上的概念和技术。一般使用,大多是为了分离数据库逻辑和程序逻辑,减少多人共同作业的难度,以及后续维护的难度。其它常见使用ORM的例子像是,Python常见的框架Django或SQLAlchemy。

         使用ORM的框架时,框架会将数据库的资料转换成对象的形式,供开发人员使用。开发人员不需要烦心资料在数据库内的字段设定,而是可以以程序语言原生的方式对对象作操作,框架会自动处理与数据库沟通的部分。

         初学ORM的第一件事,就是要先忘记数据库这件事。但是用了ORM,不代表以后都不需要直接处理数据库。ORM有其优点,但相对也会有效能问题和使用限制。当需要操作大量数据,或是有执行时间上的限制时,直接处理数据库还是有必要的。


Odoo 的 ORM

       Odoo的ORM框架,官方称之为Odoo ORM API(可参见官方文件),是数据库的数据表结构,与model间的转换。资料表内的数据,则转换成model的recordset(数据集合)。Odoo的recordset是属于Python的iterable(可迭代物),所以可以使用许多类似于list(列表)的形式。例如:

recordset.filtered(lambda r: r.name is not False)

         就近似于Python原生的filter形式。recordset也可使用在for循环中:

for r in recordset:    print(r.name)

         这里也可以注意到,存取资料的时候,是以存取对象属性的方式( r.xxx ),而不是dictionary(字典)的方式( r['xxx'] )。

Odoo recordset operation

定义数据结构

         Odoo的资料结构称为model,概念类似于对象导向中的class(类别)。Model中定义了字段( field ),概念类似于class的property(属性),例如:

name = fields.Char(string='Name', required=True)

         就定义了一个叫做name的字段,字段的标签(label)是Name,且为必填字段。

而:

value = fields.Float(string='Value', digits=(2, 4))

         则定义了一个精度到小数点后四位,四舍五入到小数后二位的浮点数字段。

Odoo Model fields

ORM 要点

         使用Odoo的ORM的时候,建议记得以下要点:

          1) 忘记数据库这件事,放心让Odoo处理。

         2)妥善规划数据结构,许多规划数据表结构的规则,依然适用在规划model上。虽然Odoo会替你处理存取数据库的苦工,但是妥善规划的数据结构可以让Odoo事半功倍。

         3)不必强迫什么都一定透过Odoo ORM处理。ORM有其优缺点,不适合的情况下,ORM反而事倍功半。

         4)Odoo ORM不是万能,但是学好它,可以让你在极短的时间内,就定制化出你想要的功能。

Odoo model methods