
教程, Odoo
Odoo中Mixins的功能
Odoo的Mixin 的核心目标是在类中创建一些功能,并将这个类与目标类混合,从而在目标类中拥有类似辅助器的功能。
12次点击9分钟阅读
1. Mixin 概述
Mixin 的核心目标是在类中创建一些功能,并将这个类目标类混合,从而在目标类中拥有类似辅助器的功能。
- 定义: Mixin 的目的是创建一些功能并将其混合到其他类中,从而提供辅助功能。
- Odoo 中的实现: 在 Odoo 中实现 Mixin 主要依赖于模型继承(model inheritance),特别是第三种继承方式,即 _inherit。
2. Odoo 中的模型继承类型
Odoo 中有三种主要的模型继承方式,但对于 Mixin 而言,第三种至关重要。
- 扩展现有模型:
- _name 与 _init 相同。
- 用于扩展现有模型,例如为 res.partner 添加新字段。
- 引用: "这里只是扩展一个新的列,你把相同的 _name 放在 _init 后面,然后你将扩展你现有的模型,例如如果你想在 res.partner 中添加一个新字段,你将使用这种模型继承。"
- 委托继承(Delegation Inheritance):
- 使用 _inherits。
- 在两个表之间创建连接。
- 示例: 当在 Odoo 中创建用户时,会自动创建 res.partner,这是通过委托继承实现的。
- 引用: " _inherits 是一个委托继承,这意味着在 Odoo 中实际上会发生什么呢?你实际上会在两个表之间创建像一个连接器。"
- Mixin 的主要继承方式:
- _name 与 _inherit 不同。
- 用途: “它的目标肯定是在一个模型中直接创建所有你想要的功能,并在不同的其他模型中继承它,这样你就可以只声明一次就将所有这些功能带回来。”
- 实现: 通常使用**抽象模型(abstract model)**来作为 Mixin 的基础。抽象模型的目的是作为一个抽象类,你可以在其中放置所有你想要的功能或字段,并将这些行为带入其他模型。
- 引用: "你通常会使用一个抽象模型,因为 Mixin 的目标是拥有一个抽象类,你可以在其中放置所有你想要的功能或所有你想要的字段,然后你可以将所有这些行为带入你的其他模型中。"
3. 视图继承(View Inheritance)
除了模型继承,视图继承也常用于 Mixin 相关的视图修改。
- XPath: 通常使用 XPath 来声明要在视图中放置元素的位置。
- 引用: "对于视图部分,我们通常使用 XPath,XPath 不直接来自 Odoo,你可以在互联网上轻松找到它,它只是一种声明并告诉 Odoo 你想把元素放在哪里的方式。"
- 示例: 将 Chatter 放在 header 之前。
4. 具体的 Mixin 示例:Mail Thread (聊天框)
mail.thread 是 Odoo 中一个广泛使用的 Mixin,它为模型添加了聊天框功能。
- 依赖: 模块需要添加 mail 依赖项到其 manifest 文件中。
- 模型继承: 在自定义模型中继承 mail.thread 和 mail.activity.mixin。
- 视图集成: 在视图中添加 chatter 元素,通常使用 XPath。
- 引用: "你必须在你的模块中添加一个 mail 的依赖项,因为所有的 mail.thread mixin 都直接在 mail 模块中。之后,当你声明你自己的模型时,你将继承自两个不同的模型:第一个是 mail.thread,那是为了聊天框,我还会添加 mail.activity,这样你就可以直接找到所有的活动。"
- 功能: 继承 mail.thread 提供了发送邮件、关注者、消息订阅/取消订阅等功能。
- 引用: "你自动拥有所有功能,包括发送邮件、关注者等等。"
- 方法调用: mail.thread 提供了如 message_subscribe() 和 message_unsubscribe() 等方法,可以在自定义业务逻辑中调用以管理关注者。
- 引用: "所有的这些方法都来自 mail.thread 模型,因为当你从这个抽象模型继承时,你直接获得了这个模型的所有功能。"
- 可追踪性: Odoo 的开放性意味着所有 Mixin 的行为都可以通过阅读源代码来理解。
- 引用: "这也是 Odoo 的强大之处,因为 Odoo 是开源的,没有什么魔法,你不仅仅是调用一个方法,如果你想了解发生了什么,你只需要阅读代码,在代码中你就能理解你所做的每一个操作。"
5. 其他常见的 Odoo 内置 Mixins
Odoo 提供了一些预构建的 Mixins,主要用于邮件相关的功能:
- mail.activity.mixin (活动): 提供一个按钮,允许用户添加和管理记录的待办事项活动。
- 引用: " mail.activity 只是你有一个按钮,你可以放置一些活动,这样你就可以管理该记录的所有待办事项。"
- mail.alias.mixin (邮件别名): 允许为特定项目创建邮件别名,以便直接通过电子邮件创建任务等。
- 引用: " mail.alias 是最好的例子,比如项目,你想为特定项目拥有自己的别名,因为你想进行全收,并直接发送大量电子邮件,然后直接在特定项目中接收,它将创建一些任务。"
- utm.mixin (UTM 追踪): 用于追踪营销活动中的信息,例如谁咨询了不同的营销活动。
- Website Mixins: 用于网站相关的功能。
- 文档: 建议查阅 Odoo 文档以查找更多有用的 Mixins。
6. 创建自定义 Mixin
用户可以根据自己的需求创建自定义 Mixin。
- 步骤:创建抽象模型: 定义一个继承自 models.AbstractModel 的抽象模型。
- 定义字段和方法: 在抽象模型中声明你想要在其他模型中重用的字段和方法(例如:first_name, last_name, full_name 计算字段和 get_full_name 方法)。
- 继承 Mixin: 在需要使用这些功能的模型中,通过 _inherit = 'your.custom.mixin' 来继承这个抽象模型。
- 在视图中集成: 在视图中添加相应的字段。
- 目的: "这是一个真正的方法,可以在你的模型中拥有一些辅助器。"
- 示例: 创建一个包含 last_name、first_name 和 full_name 字段及计算方法的 Mixin。
7. 问答环节要点
- 多公司环境: Odoo 目前的多公司管理是通过安全规则实现的,而不是通过 Mixin。
- 更新 Mixin 文档: 有用户建议更新 Mixin 文档以包含更多 Mixin 名称。
- 记录 Chatter 笔记而不发送电子邮件: 在 Chatter 中记录笔记时,可以指定消息类型,选择通知而非发送电子邮件。
- 抽象模型中的字段存储: 抽象模型中的字段确实会存储在主模型的数据库表中,但通常会保持为空,因为抽象模型本身不会被实例化。它们不会占用太多空间。
- Chatter 日志报告/审计追踪: Chatter 日志可以生成报告,实现某种形式的审计追踪。



