介绍
在 Odoo 中,模型定义了数据在数据库中的结构和存储方式。您处理的每一条业务数据,从销售订单到发票再到联系人,都存在于一个模型中。
理解 Odoo 模型对开发者和功能顾问来说都是至关重要的。模型是 Odoo 数据架构的基础。它们定义了 Odoo 字段、关系和业务逻辑。
但是 Odoo 在系统中存储每个模型的信息在哪里呢?答案是 ir.model。这个模型在 Odoo 中是一个注册表,保存着关于所有其他模型的元数据。无论您是在构建自定义模块、探索 API 还是调试 Odoo,您都会遇到 ir.model。
什么是 ir.model 模型
ir.model模型是所有Odoo模型的元数据注册表。它在系统中为每个模型存储一条记录。当您在Python中定义一个新模型或通过Odoo Studio创建一个模型时,Odoo会创建或更新一个ir.model记录。
Odoo中的这个模型由基础模块使用。它是核心框架的一部分。每个Odoo模型,无论是常规模型、Odoo抽象模型还是Odoo瞬态模型,都有一个相应的ir.model条目。
该模型在基础模块中定义。它与ir.model.fields密切相关,后者存储每个模型上每个Odoo字段的元数据。ir.model和ir.model.fields共同构成了Odoo的自省和反射能力的基础。
开发人员在需要列出可用模型、检查模型继承或构建与任何模型一起使用的动态工具时使用ir.model。Odoo中的API模型通过XML-RPC和JSON-RPC公开ir.model。
模型中的关键字段
以下是ir.model模型中最重要的Odoo字段。理解这些将帮助您有效地使用模型注册表。
1. name
类型:Char。此字段存储模型的人类可读描述。它是可翻译的,并在技术设置和开发者工具中显示。它是您在浏览模型时看到的标签。
2. model
类型:Char。模型的技术名称。这是您在Python代码中使用的字符串,例如res.partner或sale.order。它是必需的,并且为快速查找而建立索引。
3. info
类型:Text。关于模型的附加信息或备注。用于文档和内部使用。对于大多数模型可以为空。
4. state
类型:选择。指示模型是基础(来自Odoo模块)还是手动(通过Odoo Studio或自定义代码创建)。基础模型是受保护的。手动模型可以更自由地修改。
5. 瞬态
类型:布尔值。当为True时,此模型是Odoo瞬态模型。瞬态模型是临时的。它们的记录会自动清理。用于向导和临时数据。
6. field_id
类型:一对多(ir.model.fields)。在此模型上定义的Odoo字段列表。每个ir.model.fields记录描述一个字段:其名称、类型和其他属性。
7. access_ids
类型:一对多(ir.model.access)。此模型的访问权限。每条记录定义哪些组可以创建、读取、更新或删除记录。用于安全性。
8. rule_ids
类型:一对多(ir.rule)。此模型的记录规则。记录规则限制用户可以看到哪些记录。用于行级安全性。
9. inherited_model_ids
类型:多对多(ir.model)。使用Odoo模型继承时的父模型。当您在Odoo中继承一个模型时,子模型在此处链接到其父模型。这就是Odoo继承模型的工作原理。
10. modules
类型:字符。一个计算字段,列出定义此模型的模块。对于由多个模块扩展的模型,这里会显示所有模块。对于理解依赖关系非常有用。
11. 排序
类型:整数。技术设置菜单中模型的显示顺序。较低的值优先显示。用于组织模型列表。
12. 约束
类型:文本。Python 约束定义。存储 @api.constrains 装饰器的代码。用于模型具有自定义验证逻辑时。
13. 后约束
类型:文本。Python 后约束定义。类似于约束,但用于后验证。用于高级验证场景。
14. sql_约束
类型:文本。SQL 约束定义。数据库级别的约束,如唯一索引。确保数据库级别的数据完整性。
15. 视图 ID
类型:一对多(ir.ui.view)。计算字段,列出与此模型相关的视图。用于反射和视图管理。
16. 记录计数
类型:整数。计算字段,显示此模型中的记录数量。对于报告和理解模型所持有的数据量非常有用。
17. display_name
类型:字符。计算字段,用于显示表示。当记录在列表和关系中显示时使用。通常结合名称和模型。
18. create_date
类型:日期时间。存储记录创建的日期和时间。由Odoo自动管理。
19. create_uid
类型:多对一(res.users)。创建记录的用户。用于审计和跟踪。
20. write_date
类型:日期时间。存储最后修改的日期和时间。同样由系统自动管理。
21. write_uid
类型:多对一(res.users)。最后修改记录的用户。用于审计。
22. active
类型:布尔值。软删除标志。当为 False 时,记录被归档。用于已弃用的模型。
23. id
类型:整数。数据库 ID。每个 ir.model 记录的唯一标识符。在 API 调用中引用模型时使用。
24. restrict_functionality
类型:布尔值。当为 True 时,该模型在某些 Odoo 版本中功能受限。用于区分企业版与社区版。
25. is_mail_thread
类型:布尔值。指示该模型是否为邮件线程。邮件线程模型具有聊天、消息和关注者。用于支持讨论的模型。
26. is_mail_activity
类型:布尔值。指示该模型是否支持活动。活动模型具有活动规划器和下一步行动跟踪。
该模型在业务工作流程中的使用
1. 技术设置和配置
管理员使用技术设置菜单浏览模型。ir.model 记录定义了该列表中显示的内容。每个模型显示其名称、描述和字段计数。
2. 访问权限管理
在配置安全性时,管理员将访问权限分配给组。ir.model 上的 access_ids 定义了哪些组可以创建、读取、更新或删除每个模型的记录。
3. Odoo Studio 自定义
当用户在 Odoo Studio 中创建自定义模型时,Odoo 会创建新的 ir.model 记录,状态为手动。field_id 关系被填充为自定义的 Odoo 字段。
4. API 和集成发现
外部系统通过 XML-RPC 或 JSON-RPC API 与 Odoo 集成。它们可以查询 ir.model 以发现可用模型及其结构。Odoo 中的 API 模型为此提供了内部检查。
5. 模块开发和调试
开发人员在构建模块时使用 ir.model。他们检查 inherited_model_ids 以了解 Odoo 模型继承。他们检查 field_id 以查看模型上的所有 Odoo 字段。
开发者如何扩展该模型
开发人员很少直接扩展 ir.model。相反,他们在定义新模型时与其合作。加载模块时,模型注册表会自动更新。
模型继承
当您在 Python 中使用 _inherit = 'res.partner' 时,Odoo 会更新 res.partner 的 ir.model 记录。新模型的 ir.model 记录上的 inherited_model_ids 将链接到父模型。这就是 Odoo 模型继承的工作原理。Odoo 中的继承模型保持注册表同步。
添加字段
当您向模型添加新的 Odoo 字段时,Odoo 会创建 ir.model.fields 记录。这些记录通过 model_id 字段链接到 ir.model。ir.model 记录本身不会被修改。
Python 扩展
您通常不会重写 ir.model 方法。该模型是核心框架的一部分。如果您需要自定义行为,请扩展 ir.model 描述的模型,而不是 ir.model 本身。
Odoo Studio
Odoo Studio 在您构建自定义模型时会创建 ir.model 和 ir.model.fields 记录。无需代码。transient 标志将 Odoo 瞬态模型与常规模型区分开。抽象模型(Odoo 抽象模型)不会创建 ir.model 记录,因为它们没有数据库表。
最佳实践
- 使用 ir.model 进行自省和发现。在构建集成时,查询 ir.model 列出可用模型,而不是硬编码。
- 使用模型字段进行查找。它是被索引的。当您需要特定模型的元数据时,通过模型名称进行搜索。
- 在构建自定义模块时检查 inherited_model_ids。在扩展之前了解继承链。
- 使用 Odoo 中的 API 模型(XML-RPC 或 JSON-RPC)读取 ir.model。除非您正在构建类似 Studio 的工具,否则避免修改它。
- 使用 ir.model.fields 进行字段级自省。field_id 关系为您提供模型上的所有 Odoo 字段。
常见错误
- 直接修改 ir.model 记录。注册表由 Odoo 管理。更改可能会破坏系统或在升级时被覆盖。
- 将 ir.model 与 Python 模型类混淆。ir.model 是数据库记录。Python 类是实际模型。它们相关但不同。
- 假设所有模型都有 ir.model 记录。Odoo 抽象模型类不会创建数据库表或 ir.model 记录。
- 忘记了临时模型是暂时的。临时标志意味着Odoo临时模型数据会被清理。请勿将其用于永久数据。
- 查询ir.model时未进行过滤。一个典型的Odoo实例有数百个模型。始终按模型名称过滤或使用搜索域。
结论
ir.model模型是所有Odoo模型的注册表。它存储系统中每个模型的元数据。理解其字段以及它与ir.model.fields的关系将帮助您导航Odoo数据架构。
无论您是探索技术设置的功能顾问,还是构建API集成的开发人员,扎实掌握ir.model将节省时间并防止错误。
需要帮助进行 Odoo 实施吗?
Dasolo帮助公司实施、定制和优化Odoo。我们专注于API集成和Odoo开发。我们的团队在Odoo数据架构和像ir.model这样的模型方面拥有深厚的经验。
如果您需要Odoo实施、自定义模块或集成方面的帮助,我们随时为您提供帮助。 预约演示 以讨论您的项目。