一、Odoo核心数据模型三大类1.核心两大业务模型models.Model vs models.TransientModela. models.Model —— 持久化业务模型开发主力核心概念Odoo 最常用、最核心的模型类是业务开发的核心载体。数据会永久存储在数据库中系统会自动为该模型创建真实的数据库表。支持增删改查、数据关联、权限控制、视图配置、工作流等所有Odoo核心功能。自带完整的ORM对象关系映射能力可直接通过ORM方法操作数据。适用场景必须使用该模型所有需要长期保存、后续需查询、统计、关联的业务核心数据具体包括基础业务数据客户、供应商、产品、订单、发票等。组织架构数据员工、部门、岗位等。业务流程数据库存记录、生产工单、采购单等。自定义业务模块的核心数据表以及任何需要长期留存的业务数据。代码示例from odoo import models, fields class SaleOrder(models.Model): # 数据库表名必填sale_order默认与_name一致可通过_table修改 _name sale.order # 模型描述必填用于文档和界面显示 _description Sales Order # 持久化字段数据永久存储在数据库 name fields.Char(stringOrder Number, requiredTrue) # 订单编号必填 partner_id fields.Many2one(res.partner, stringCustomer) # 关联客户多对一 amount_total fields.Float(stringTotal Amount) # 订单总金额小数b. models.TransientModel —— 临时模型 / 向导模型核心概念数据临时存储Odoo会通过定时任务定期清理表中数据不长期留存。虽然也会创建数据库表但仅用于存储临时操作数据不存储业务核心数据。专门用于向导Wizard、弹窗交互、临时操作、批量处理等场景。无权限控制、无复杂业务状态、无复杂数据关联功能相对简单。适用场景必须使用该模型仅需要临时交互、一次性操作操作完成后数据无需留存的功能具体包括数据导入/导出向导如批量导入客户、导出订单数据。批量操作批量修改数据、批量删除记录、批量发送邮件等。弹窗交互报表参数配置弹窗、打印格式配置弹窗等。一次性操作操作确认弹窗、临时表单填写等。代码示例from odoo import models, fields class SaleOrderBatchSend(models.TransientModel): # 临时模型表名必填 _name sale.order.batch.send _description Batch Send Sales Order # 模型描述 # 临时字段操作完成后会被系统自动清理 order_ids fields.Many2many(sale.order, stringOrders) # 关联需要发送的订单多对多 send_note fields.Text(stringSend Note) # 发送备注多行文本 def action_send_orders(self): # 执行业务逻辑批量修改订单状态执行完成后数据无需留存 self.order_ids.write({state: sent}) return {type: ir.actions.act_window_close} # 关闭向导弹窗 #### c. models.AbstractModel —— 抽象模型仅作为基类核心概念不创建数据库表仅作为继承基类使用无法直接存储数据。用于封装多个模型共用的公共字段、公共方法实现代码复用减少冗余。不能创建视图、不能直接实例化使用只能被其他模型继承。适用场景当多个模型需要共用相同的字段或方法时抽离公共逻辑统一封装为抽象模型具体包括公共基础字段创建时间、修改时间、创建人、修改人、是否激活等。公共业务方法通用数据校验、通用格式转换、公共查询逻辑等。代码示例from odoo import models, fields class BaseCommon(models.AbstractModel): # 抽象模型标识必填 _name base.common _description Base Common Model # 模型描述 # 公共字段所有继承该抽象模型的模型都会自动拥有这些字段 create_date fields.Datetime(stringCreate Time, defaultfields.Datetime.now) # 创建时间默认当前时间 create_uid fields.Many2one(res.users, stringCreator) # 创建人关联系统用户 active fields.Boolean(stringActive, defaultTrue) # 是否激活默认勾选 继承抽象模型自动获得公共字段 class Product(models.Model): _name product.product # 产品模型表名 _inherit base.common # 继承公共抽象模型无需重复定义公共字段二、Odoo模型方法命名规范核心常识Odoo模型中方法的命名的核心原则根据调用者框架/用户区分以下是具体规范和说明1.方法调用区分以 _ 开头的方法Odoo框架专用的内部方法由框架自动调用不建议手动调用。不以 _ 开头的方法对外暴露的业务方法用于用户操作如按钮点击、界面触发、外部调用。a.特殊方法命名规则必记计算字段方法必须以compute开头格式为 _compute_字段名用于计算字段的逻辑实现。反向计算字段方法以inverse开头用于可手动修改的计算字段反向写入数据。默认值方法以default开头用于设置字段的默认值。约束校验方法以check开头用于自定义数据校验逻辑。b.私有方法约定以 _ 开头的方法同时约定为私有方法仅在当前模型类内部使用不对外暴露调用。计算方法、框架内部方法均需加 _ 前缀避免被外部误调用。一句话总结Odoo框架自己使用、自动调用的方法全部带下划线 _给用户、界面、外部使用的方法不带下划线。三、Odoo开发必背8大装饰器核心重点装饰器用于修饰模型方法定义方法的作用范围、触发时机和功能以下是业务开发中常用的8种装饰器重点掌握前5种1. api.multi最常用作用使方法支持处理多条记录self为记录集可循环遍历。适用场景按钮点击、业务逻辑方法、界面触发的动作。注意事项Odoo12及以前版本所有处理多条记录的方法必须添加后续版本可省略但建议保留以保证兼容性。2. api.model作用方法不操作已有记录仅针对模型本身进行操作self不指向任何具体记录。适用场景创建新记录、搜索记录、数据统计、定时任务scheduled action、公共工具方法。3. api.one废弃极少用作用方法仅处理单条记录self为单条记录无需循环。注意事项目前已被api.multi替代业务开发中基本不用避免使用。4. api.depends(字段1, 字段2...)作用监听指定字段当这些字段的值发生变化时自动重新计算当前方法用于计算字段。适用场景computexxx的计算字段必须搭配 _compute_xxx 格式的方法使用。注意事项方法名必须以compute开头与计算字段名对应。5. api.constrains(监控字段)作用在记录保存前自动校验监控字段的值若不满足校验条件报错并阻止保存。适用场景日期合理性校验、金额范围校验、状态校验、数据唯一性校验等。特点自带api.multi功能无需额外添加可处理多条记录。6. api.onchange(字段)作用在前端界面修改指定字段时立即触发该方法无需保存记录实现界面联动。适用场景选择客户后自动带出客户地址、修改商品数量后自动计算金额、选择分类后过滤商品列表等。特点仅作用于单条记录self为当前编辑的单条记录无需循环。7. api.depends inverse极少用作用用于可手动修改的计算字段实现“计算字段反向写入”即手动修改计算字段值时同步更新其依赖的字段。适用场景特殊业务场景普通开发中极少用到。8. api.noguess几乎不用作用底层框架控制用于禁止Odoo自动推断方法的参数和返回值。适用场景仅底层开发使用业务开发中永远不会碰到无需深入掌握。装饰器快速对应表必记按钮动作、业务方法 → api.multi新建记录、搜索、统计、定时器 → api.model计算字段自动计算 → api.depends记录保存前校验 → api.constrains前端界面联动 → api.onchange四、常用代码片段解析1. 视图查找self.env.ref(外部ID)self.env.ref(emabc_expense.wizard_emabc_expense_pay_form)self.env当前模型的环境对象Environment包含当前用户、数据库、上下文等信息是Odoo开发中获取各类资源的核心入口。ref()方法通过视图的外部IDXML ID查找对应的视图记录外部ID格式为“模块名.视图ID”。emabc_expense.wizard_emabc_expense_pay_form视图的外部ID其中emabc_expense是模块名wizard_emabc_expense_pay_form是视图的ID。2. 获取记录ID.id用法在查找记录后通过 .id 可获取该记录在数据库中的唯一ID主键。示例self.env.ref(模块名.视图ID).id用于获取视图的数据库ID常用于弹窗跳转、视图渲染等场景。五、Odoo常用字段类型10种必记字段是模型的核心组成部分用于定义数据的类型和属性以下是业务开发中最常用的10种字段类型按类别划分方便记忆1.基础字段7种最常用fields.Char()单行文本用于存储短文本信息如名字、编号、手机号等。fields.Text()多行文本用于存储长文本信息如备注、描述、详细说明等。fields.Integer()整数用于存储无小数的数值如数量、天数、个数等。fields.Float()小数用于存储有小数的数值如金额、比例、重量等可通过digits参数设置小数位数。fields.Boolean()勾选框用于存储布尔值是/否如是否激活、是否审核等默认值为False。fields.Date()日期用于存储日期格式2025-01-01如订单日期、出生日期等。fields.Datetime()日期时间用于存储具体的日期和时间格式2025-01-01 12:00:00如创建时间、修改时间等。