先说结论
很多 Odoo 开发都会遇到这种情况:
- 计算字段显示是对的
- 但搜索、筛选、domain 却怎么都不对
这往往不是前端问题,而是你没先想清楚:
这个字段的值,系统到底应该怎么拿来参与搜索。
所以“会显示”和“可搜索”是两件事。
为什么这类问题特别容易误判
因为用户视角会觉得很自然:
- 页面都已经显示出来了
- 系统为什么不能直接拿它搜?
但 ORM 视角并不是这么简单。
一个字段能不能被搜索,取决于很多因素:
- 它是不是存储字段
- 它的值有没有真实持久化
- 如果没存,搜索系统要怎么把“搜索这个字段”翻译成别的条件
所以显示层和搜索层,常常不是同一条路。
为什么非存储 compute 字段最容易出这个问题
因为它的值很多时候只是:
- 在读取时算出来
而不是:
- 数据库里本来就有一列现成值等你过滤
这意味着搜索系统如果想支持它,就得知道:
- 当用户搜这个计算字段时,应该改写成什么真实条件
否则就会出现“看得见,但搜不准”。
search 方法真正解决的是什么
它更像:
把“用户想按这个计算字段搜索”翻译成系统真正能执行的 domain。
所以它不是给字段“加点功能”,而是在补一层语义桥接。
特别是对那些:
- 逻辑值
- 状态组合值
- 由多个字段推导出的结果
它就很有价值。
为什么 store=True 和 search= 容易被混
因为它们都和“能不能搜”有关,但不是同一路子。
你可以先粗暴理解成:
store=True:把结果存下来,搜索更像普通字段search=:不一定存,但要告诉系统怎么把搜索意图翻译出去
所以一个更偏持久化路径,一个更偏语义翻译路径。
为什么很多字段并不是“显示正确就够了”
因为用户真正操作系统时,除了看,还要:
- 搜索
- 筛选
- 分组
- 设 domain
如果一个字段只会显示,不能稳定参与这些动作,那它在业务上就还是“半成品”。
这也是为什么计算字段设计时,最好不要只想页面显示效果。
实战里最容易踩的 5 个坑
1. 以为显示出来就天然可搜索
这是最常见误区之一。
2. 非存储 compute 字段却没考虑 search 语义
结果一筛选就怪。
3. 把 store=True 和 search= 混成同一件事
设计思路会乱。
4. 字段业务上很关键,却只做成展示层结果
后续搜索和 domain 都不好用。
5. 只从表单视角设计字段,不从查询视角设计字段
系统体验会断层。
一句话记忆法
把它记成一句话:
计算字段“能显示”不等于“能搜索”;要么把结果存下来,要么明确告诉 Odoo:当用户搜这个字段时,应该翻译成什么真实条件。
理解这一句,计算字段搜索问题就会清楚很多。
DISCUSSION
评论区