先说结论
在 Odoo 里,文件相关能力并不是“字段里塞一段二进制”这么简单。
很多场景里真正涉及的是几层关系:
- 业务对象字段(
Binary/Image) - 附件记录
ir.attachment - 最终文件内容的存储方式
所以当你问“这个文件到底存哪了”,往往不能只盯一个字段看。
为什么这个问题经常让人迷糊
因为页面上看起来只是:
- 上传一个文件
- 上传一张图片
- 在表单里显示出来
所以很容易误以为:
- 文件内容就直接老老实实躺在当前模型这一列里
但在 Odoo 里,很多文件能力实际上会和附件机制深度关联。
也就是说,页面上的“文件字段体验”和底层真正的附件存储,并不一定是一层东西。
Binary 和 Image 字段更像什么
它们更像:
业务对象暴露给用户的文件入口。
也就是说,用户是通过这些字段和文件交互。
但“入口”不等于“最终存储模型”。
尤其当系统要支持:
- 文件复用
- 下载
- 预览
- 访问控制
- 附件列表
时,ir.attachment 往往就会进入这条链。
ir.attachment 真正扮演什么角色
最通俗的理解是:
系统级附件登记与承载层。
它更像附件世界里的统一对象。
很多时候它会负责:
- 记录这是哪个业务对象的附件
- 记录文件名、类型等元信息
- 挂接真实文件内容
- 让附件能被统一管理和访问
所以 ir.attachment 不是“可有可无的旁支”,而是很多文件能力真正的中枢。
为什么“字段里有图”和“附件里有文件”不是同一视角
因为它们面对的对象不同:
- 字段视角关注:这个业务对象要不要展示/编辑这份内容
- 附件视角关注:系统如何统一登记、关联和管理文件资产
这也是为什么同一个文件问题,有时你从字段能看到,有时你更应该去查附件记录。
为什么文件问题常常不只是“能不能上传”
因为后面还会牵扯很多边界:
- 权限谁能看
- 文件跟哪个对象绑
- 删记录后附件怎么处理
- 图片缩略图怎么来
- 业务字段和附件记录是否同步
所以文件机制不是小功能,它往往涉及对象关系、权限和存储策略三层一起看。
实战里最容易踩的 5 个坑
1. 以为文件内容只在业务字段里
排查路径会错。
2. 只改字段,不理解附件层
后面下载/预览/权限会出怪问题。
3. 把图片字段和通用附件机制完全分开理解
容易漏掉真实关联。
4. 删除业务对象时没考虑附件收尾
会留下脏附件或误删文件。
5. 只看前端上传是否成功,不看底层附件记录是否正确
这种问题最容易埋雷。
一句话记忆法
把它记成一句话:
Binary/Image字段更像业务入口,ir.attachment更像系统级附件承载层,所以文件到底“存哪”往往要同时看字段、附件记录和底层存储链。
理解这一句,Odoo 文件机制就没那么雾里看花了。
DISCUSSION
评论区