介绍
在 Odoo 中,模型定义了数据在数据库中的结构和存储方式。您处理的每一条业务数据,从销售订单到库存再到产品,都存在于一个模型中。
理解 Odoo 模型对开发者和功能顾问都至关重要。模型是 Odoo 数据架构的基础。它们定义了 Odoo 字段、关系和业务逻辑。
本文重点介绍 Odoo 中最重要的模型之一:product.product。无论您是在构建自定义模块、集成外部系统,还是配置产品目录,您都将使用该模型。
什么是 product.product 模型
product.product 模型表示 Odoo 中实际的产品变体。这些是出现在销售订单、采购订单和库存移动中的具体、可销售和可购买的项目。
Odoo 中的这个模型与 product.template 不同。模板保存产品系列的共享属性。product.product 记录是具体的变体。对于没有变体的简单产品,每个 product.template 对应一个 product.product。对于可配置产品(例如带有尺寸和颜色的 T 恤),每种组合都是一个单独的 product.product。
该模型在产品模块 (product) 中定义。销售、采购、库存和电子商务都引用 product.product。当您向报价中添加一行或接收库存时,您将处理 product.product 记录。
product.product 使用来自 product.template 的委托继承。许多 Odoo 字段在模板上定义并由变体继承。这将共享数据保留在一个地方,同时允许特定于变体的覆盖。
模型中的关键字段
以下是 product.product 模型中最重要的 Odoo 字段。理解这些将帮助您有效地处理产品变体。
1. name
类型:Char。该字段存储产品变体的名称。通常在列表、表单和文档中显示。对于简单产品,它与模板名称匹配。对于变体,它可能包含属性值(例如 "T-Shirt - Blue / M")。
2. product_tmpl_id
类型:Many2one (product.template)。将变体链接到其父模板。这是核心关系。每个 product.product 恰好属于一个 product.template。当您需要在 Odoo 中继承模型或扩展产品逻辑时使用此字段。
3. default_code
类型:Char。内部参考或 SKU。用于识别、条形码查找和与外部系统的集成。每个变体可以有自己的代码。
4. barcode
类型:字符。条形码(EAN、UPC等)。用于在POS、仓库和库存中扫描。设置时必须在产品之间唯一。
5. 创建日期
类型:日期时间。存储记录创建的日期和时间。由Odoo自动管理。对报告和审计很有用。
6. 修改日期
类型:日期时间。存储最后修改的日期和时间。也由系统自动管理。帮助跟踪数据最后更新的时间。
7. 活跃状态
类型:布尔值。软删除标志。当为False时,记录被归档并从默认视图中隐藏。产品不会被物理删除,以保留历史记录。
8. 类型
类型:选择。产品类型:消耗品、服务或可存储产品。消耗品不在库存中跟踪。服务没有库存。可存储产品在库存中跟踪。这决定了适用的模块和工作流程。
9. 类别ID
类型:多对一(product.category)。产品类别。用于报告、定价规则和目录组织。类别可以具有父子层次结构。
10. 列表价格
类型:浮动。销售价格。显示在报价单上,并在添加行时作为默认值。可以根据客户或价格表进行覆盖。
11. standard_price
类型:浮动。成本价格。用于库存评估和利润计算。通常通过采购订单或手动输入进行更新。
12. uom_id
类型:Many2one (uom.uom)。销售和库存的计量单位。定义数量的表达方式(单位、千克、升等)。
13. uom_po_id
类型:Many2one (uom.uom)。采购的计量单位。可以与uom_id不同(例如,按箱购买,按单位销售)。转换自动处理。
14. description_sale
类型:Html。销售描述。显示在报价单、订单和发票上。可以包含格式和产品细节。
15. description_purchase
类型:Html。采购描述。显示在采购订单和供应商账单上。用于内部和供应商沟通。
16. sale_ok
类型:布尔值。可以出售。当为 False 时,该产品在销售和电子商务中隐藏。适用于内部或仅限购买的商品。
17. purchase_ok
类型:布尔值。可以购买。当为 False 时,该产品在购买中隐藏。适用于制造或仅限销售的商品。
18. image_1920
类型:二进制。产品的全分辨率图像。Odoo 存储多个尺寸(image_512、image_256 等)以供显示。用于表单、电子商务和报告。
19. weight
类型:浮点数。产品重量。用于运输计算和物流。单位取决于公司配置。
20. volume
类型:浮点数。产品体积。用于运输和仓库容量。对于有体积限制的企业非常重要。
21. company_id
类型:Many2one(res.company)。在多公司设置中,这表示哪个公司拥有该产品。影响记录可见性和库存。
22. currency_id
类型:Many2one(res.currency)。用于 list_price 和 standard_price 的货币。通常是公司的货币。价格表可以转换为其他货币。
23. qty_available
类型:Float。现有数量。根据库存量计算。只读。用于可用性检查和报告。仅适用于可存储产品。
24. virtual_available
类型:Float。预测数量(现有加上即将到来的减去已发出的)。用于可用性和补货。只读计算字段。
25. product_template_attribute_value_ids
类型:Many2many。链接到定义此变体的属性值(例如,颜色=蓝色,尺寸=中号)。用于变体配置和过滤。
26. sequence
类型:Integer。显示顺序。用于在列表和配置器中对产品进行排序。较低的值优先显示。
27. display_name
类型:Char。计算的显示名称。将名称与变体属性结合。用于 many2one 下拉菜单和搜索结果。只读。
28. responsible_id
类型:Many2one(res.users)。产品的负责人。用于重新订购规则和内部分配。可选。
该模型在业务工作流程中的使用
1. 销售和报价
当销售人员创建报价时,他们从目录中选择一个产品.product。list_price、description_sale 和 uom_id 流向订单行。价格表可以覆盖价格。只有 sale_ok=True 的产品才会出现。
2. 采购和供应商
采购订单和供应商账单引用 product.product。standard_price 从采购成本更新。具有 purchase_ok=True 的产品可用。uom_po_id 定义了如何订购数量(例如按箱)。
3. 库存和库存
库存移动、拣货和数量都使用 product.product。qty_available 和 virtual_available 字段驱动可用性。只有可存储的产品会被跟踪。条形码扫描使用条形码字段进行快速查找。
4. 电子商务和网站
网站商店显示 product.product 记录。具有不同属性(尺寸、颜色)的变体作为选项显示。产品图像、描述和价格来自模型。sale_ok 标志控制可见性。
5. 制造和MRP
物料清单引用 product.product 作为组件和成品。type 字段决定产品是制造(可存储)还是消耗。库存水平驱动生产计划。
开发者如何扩展该模型
开发人员使用多种模式扩展 product.product。Odoo 模型继承是主要机制。
模型继承
使用 _inherit = 'product.product' 来扩展模型。添加新的Odoo字段,重写方法或添加约束。在Odoo中,继承模型将您的更改保存在单独的模块中,以便于升级。当字段是特定于变体时选择 product.product;当它适用于整个产品系列时使用 product.template。
添加字段
在您继承的模型中定义新的Odoo字段。使用正确的字段类型:Char、Many2one、Boolean、Integer、Text、Selection。考虑字段是属于模板(共享)还是变体(特定)。对于像SKU或条形码覆盖这样的特定于变体的数据,请使用 product.product。
Python扩展
重写 create、write 或 unlink 来添加逻辑。使用 super() 来调用原始方法。对计算字段及其依赖关系要小心。product.product模型有许多来自库存和销售模块的计算字段。
Odoo Studio
Odoo Studio允许您无需代码添加字段。适合快速定制。对于复杂逻辑或升级,自定义模块更易于维护。Odoo中的API模型(product.product)通过XML-RPC和JSON-RPC完全公开,以便于集成。
最佳实践
- 使用 default_code 或 barcode 进行外部系统映射。保持它们的唯一性和一致性。
- 为每个产品正确设置类型。消耗品与可存储品与服务影响适用的模块和工作流程。
- 在构建API集成时,使用 product.product 进行订单行和交易。使用 product.template 进行目录级操作。
- 对于自定义字段,使用
x_前缀或模块前缀以避免与未来的Odoo版本发生冲突。 - 在添加适用于所有变体的字段时,请考虑使用 product.template(例如品牌、类别)。对于特定于变体的数据,请使用 product.product(例如特定于变体的条形码)。
常见错误
- 当需要特定于变体的逻辑时,请从 product.template 继承。对于每个变体的行为,请使用 product.product。
- 手动创建 product.product 记录,而不是通过模板创建。对于变体产品,请通过产品配置器创建它们。
- 忘记设置 sale_ok 或 purchase_ok。在某些配置中,产品默认隐藏在销售/采购中。
- 覆盖核心方法而不调用 super()。这可能会破坏其他模块或未来的升级。
- 在域中使用 product.product,而使用 product.template 会更合适(例如,在模板上按类别过滤)。
结论
product.product 模型是 Odoo 产品架构的核心。它代表实际可销售和可采购的商品。理解其字段及其与 product.template 的关系将帮助您有效配置、定制和集成 Odoo。
无论您是映射产品目录的功能顾问,还是构建自定义模块的开发人员,深入了解 product.product 将节省时间并防止错误。
需要帮助进行 Odoo 实施吗?
Dasolo 帮助公司实施、定制和优化 Odoo。我们专注于 API 集成和 Odoo 开发。我们的团队在 Odoo 数据架构和像 product.product 这样的模型方面拥有深厚的经验。
如果您需要帮助进行 Odoo 实施、自定义模块或集成,我们随时为您提供帮助。 预约演示 以讨论您的项目。