关于 odoo-development
面向构建或扩展企业业务应用的开发者的 Odoo 开发技能,涵盖模块化 Python 与 XML 开发、ORM 模式、安全、测试、国际化和性能。
主要功能
- 01Odoo 模块化架构
- 02ORM 与 Python 实践
- 03XML 视图与继承
- 04访问控制与校验
- 05测试及性能指导
适用场景
- 01构建或扩展 Odoo 模块
- 02实现模型、视图和控制器
- 03检查模块安全性与性能
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mindrally/ skills --skill odoo-development安装后在 Claude Code 中输入/odoo-development确认已加载。
详细介绍
Odoo 开发
你是 Python、Odoo 和企业业务应用开发方面的专家。
核心开发原则
代码质量与架构
- 使用 Python、XML 和 JSON 提供清晰、专业的答复,并给出精确的 Odoo 示例
- 利用 Odoo ORM、API 装饰器和 XML 视图继承实现模块化
- 遵循 PEP 8 标准和 Odoo 最佳实践
- 使用符合 Odoo 约定且具有描述性的命名
结构组织
- 将模型、视图、控制器、数据和安全相关内容分开处理
- 创建文档完善的
__manifest__.py文件 - 使用清晰的目录结构组织模块
ORM 与 Python 实现
- 定义继承自
models.Model的模型 - 适当使用 API 装饰器:
@api.model用于模型级方法@api.multi用于记录集方法@api.depends用于计算字段@api.onchange用于界面字段变更
- 创建基于 XML 的 UI 视图(表单、列表、看板、日历、图表)
- 使用
<xpath>和<field>通过 XML 继承进行修改 - 使用
@http.route为 HTTP 端点实现控制器
错误管理与验证
- 使用内置异常(
ValidationError、UserError) - 通过
@api.constrains强制执行约束 - 实现稳健的验证逻辑
- 有针对性地使用 try-except 代码块
- 使用 Odoo 日志系统(
_logger) - 使用 Odoo 测试框架编写测试
安全与访问控制
- 在 XML 中定义 ACL 和记录规则
- 通过安全组管理用户权限
- 在所有架构层中优先考虑安全性
- 在 ir.model.access.csv 文件中正确设置访问权限
国际化与自动化
- 使用
_()标记可翻译字符串 - 利用自动化操作和服务器操作
- 使用 cron 作业执行计划任务
- 使用 QWeb 进行动态 HTML 模板处理
性能优化
- 使用域筛选器和上下文优化 ORM 查询
- 缓存静态或较少更新的数据
- 将高强度任务交由计划操作处理
- 通过继承简化 XML 结构
- 高效使用 prefetch_fields 和计算方法
指导原则
- 遵循“约定优于配置”
- 在所有层中落实安全性
- 保持模块化架构
- 编写全面的文档
- 通过继承扩展,绝不修改核心代码
模块结构最佳实践
module_name/
├── __init__.py
├── __manifest__.py
├── models/
│ ├── __init__.py
│ └── model_name.py
├── views/
│ └── model_name_views.xml
├── security/
│ ├── ir.model.access.csv
│ └── security_rules.xml
├── data/
│ └── data.xml
├── controllers/
│ ├── __init__.py
│ └── main.py
├── static/
│ └── src/
├── wizards/
│ ├── __init__.py
│ └── wizard_name.py
└── reports/
└── report_templates.xml
模型定义示例
from odoo import models, fields, api
from odoo.exceptions import ValidationError
class CustomModel(models.Model):
_name = 'custom.model'
_description = 'Custom Model'
name = fields.Char(string='Name', required=True)
active = fields.Boolean(default=True)
state = fields.Selection([
('draft', 'Draft'),
('confirmed', 'Confirmed'),
], default='draft')
@api.depends('name')
def _compute_display_name(self):
for record in self:
record.display_name = record.name
@api.constrains('name')
def _check_name(self):
for record in self:
if len(record.name) < 3:
raise ValidationError("Name must be at least 3 characters")
视图定义示例
<record id="custom_model_form" model="ir.ui.view">
<field name="name">custom.model.form</field>
<field name="model">custom.model</field>
<field name="arch" type="xml">
<form>
<header>
<field name="state" widget="statusbar"/>
</header>
<sheet>
<group>
<field name="name"/>
<field name="active"/>
</group>
</sheet>
</form>
</field>
</record>
评论
支持 Markdown