ODOO 17自定义报表:如何为用户获取两个排序后的crm.lead记录集?
Odoo中为用户获取指定排序和限制的crm.lead记录集方案
问题背景
我在crm.lead模型中新增了两个字段col1和col2,需要为每个用户获取两个记录集,分别对应以下SQL逻辑:
select * from crm_records order by col1 desc limit 5select * from crm_records order by col2 desc limit 5
最初尝试在抽象类中修改_where_calc方法,代码如下:
query.order = f"{self._table}.{top_field} DESC" query.limit = top_limit
并基于父类查询追加:
query = super()._where_calc(*args, **kwargs)
但遇到两个问题:
- 返回所有符合domain条件的记录,limit限制未生效;
- 无法按预期排序,仅在过滤器中手动设置排序时才生效。
解决方案
不要修改_where_calc这类底层查询构建方法,直接使用Odoo ORM提供的search方法即可实现需求,这是官方推荐的标准用法:
基础用法(无额外过滤条件)
直接调用search,指定排序规则和数量限制:
# 获取按col1降序排列的前5条记录 col1_top5_records = self.env['crm.lead'].search([], order='col1 desc', limit=5) # 获取按col2降序排列的前5条记录 col2_top5_records = self.env['crm.lead'].search([], order='col2 desc', limit=5)
结合用户当前过滤条件
如果需要保留用户当前视图的domain过滤规则(比如已设置的过滤器),可以从上下文获取当前domain后再传入:
# 从上下文获取当前视图的过滤domain current_domain = self.env.context.get('search_default', []) # 结合过滤条件获取目标记录集 col1_top5_records = self.env['crm.lead'].search(current_domain, order='col1 desc', limit=5) col2_top5_records = self.env['crm.lead'].search(current_domain, order='col2 desc', limit=5)
原方法失效原因
- 代码执行顺序错误:你先修改了
query的order和limit,再调用父类的_where_calc,父类方法会重新构建查询,覆盖你之前的设置; _where_calc是底层构建查询条件的方法,Odoo后续的查询处理流程(如视图分页、排序逻辑)会重新覆盖order和limit参数,导致自定义设置失效。
内容的提问来源于stack exchange,提问作者Claudiu
相关产品推荐
相关产品推荐

