模型和Python类

来自Odoo大V社-odoo中文开发手册
7017511讨论 | 贡献2017年5月4日 (四) 05:45的版本

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

Odoo模型由Python类表示。在前面的代码中,有一个基于models.Model模型的Python类Stage,它定义了新的odoo模型: todo.task.stage.

Odoo模型被保存在一个中央注册中心,旧的Odoo版本中也被称为池。它是一个字典,它可以引用实例中可用的所有模型类,并且它可以被一个模型名引用。具体来说,模型方法代码中可以通过 self.env['x'] 获取一个代表model x的类的引用。

您可以看到,模型名称很重要,因为它们是用于访问注册中心。模型名称的约定规则是使用包含点的小写字母列表,如todo.task.stage。核心模块的其他例子有project.project, project.task, 或者 project.task.type。我们应该用单数形式todo.task 而不是todo.tasks。由于历史原因,有些核心模型没有遵循这些,例如res.users,但是规则并非如此。

模型名称必须是全局唯一的。正因为如此,第一个词应该对应于该模块涉及到的主要应用程序。在我们的例子中是 todo,核心模型的例子有 project, crm, 或者 sale.

另一方面 Python的类 在本地的python文件声明,用于它们的标识符仅对该文件中的代码有效。基于此,类标识符并没有要求在相关主应用程序中前置声明。所以我们为

todo.task.stage 命名类stage 是没有问题的。在其他模块中,不存在与可能的类发生冲突的风险。

类标识符可以使用两种不同的约定规则:snake_case或CamelCase。从历史上看,Odoo的代码使用了snake_case的案例,而且仍然可以找到使用这个约定的类。但是趋势是使用 CamelCase,因为它是Python标准定义的“PEP8”编码惯例。您可能已经注意到我们使用的是后一种形式。

上一节:模型属性
下一节:瞬态和抽象模型