先说结论
在 Odoo 里,很多人以为“产品就是一张产品表”。
但真正常用的两个核心对象其实是:
product.templateproduct.product
最实用的理解是:
template 更像产品母版,product 更像可被实际买卖、库存、条码和变体区分的具体 SKU。
一旦你开始做规格、颜色、尺码、库存、条码这些东西,这两个模型就必须分清。
为什么这个问题特别容易混
因为在最简单场景里,一个模板可能只对应一个变体。
于是你会产生错觉:
- 这俩不就差不多吗?
但一旦进入多属性产品,比如:
- 颜色
- 尺码
- 版本
- 包装规格
差异就会立刻放大。
这也是为什么很多产品相关 bug,根因其实不是库存逻辑,而是模型边界没想清。
product.template 更像什么
它更像:
这个产品家族的公共定义。
通常它承载的是:
- 产品名称
- 通用描述
- 通用分类
- 大部分共享属性
- 变体生成规则
也就是说,它更像“这一类产品的统一母版”。
product.product 更像什么
它更像:
真正落到业务执行层的具体可操作对象。
很多实际业务动作更关心的是它:
- 哪个具体条码
- 哪个具体规格组合
- 哪个具体库存数量
- 哪个具体销售行上的商品
所以如果你在想“仓库里到底是哪一件货”,通常就更接近 product.product。
为什么变体一进来,边界就很关键
因为变体会把“公共信息”和“具体组合”拆开。
例如一个 T 恤:
- 模板层:T 恤这个产品家族
- 变体层:黑色 / L 码、白色 / M 码……
这时你如果还用“一个产品就是一个对象”的脑回路,很快就会乱。
所以一旦开始做属性组合,就要自然地切到:
- 模板 = 统一定义
- 变体 = 具体执行对象
为什么库存和条码问题常常更靠近 product.product
因为库存、预留、移动、条码这些东西,通常都必须落到“具体 SKU”。
仓库不会问:
- 这是不是某个产品家族
它会问:
- 到底是哪一个具体变体
- 是哪一个条码
- 是哪一个库存对象
所以很多库存问题如果你还只盯 template,很容易看偏。
实战里最容易踩的 5 个坑
1. 该在模板层配的东西写到变体层
后面共享逻辑会乱。
2. 该在变体层区分的东西只写模板层
规格差异表达不出来。
3. 只在无变体场景测试
一上属性组合就爆问题。
4. 库存/条码问题还按 template 思维排查
方向会偏。
5. 把“产品展示对象”和“业务执行对象”混成一层
后面价格、库存、条码、采购都容易乱套。
一句话记忆法
把它记成一句话:
product.template是产品家族母版,product.product是真正参与库存、销售、条码和变体组合的具体 SKU。
理解这一句,很多产品模型问题都会瞬间清楚。
DISCUSSION
评论区