如何在Odoo v15中创建可直接编辑的非聚合数据透视表视图
Odoo v15 非聚合可编辑透视表实现方案
首先明确:Odoo v15原生数据透视视图默认仅支持聚合类数据展示,且视图全局只读,无法直接满足非聚合展示、空值补0、单元格直接编辑的需求,可通过以下两种方案实现:
方案一:扩展原生透视视图(保留透视表交互逻辑)
该方案基于原生Pivot视图做前后端扩展,无需额外新增模型,适配动态日期范围的灵活性更高
- 后端改造
- 给原模型添加
product_id+date的唯一约束,确保同产品同日期仅存在一条数据,这是无需聚合计算的基础前提,代码示例:_sql_constraints = [ ('product_date_unique', 'UNIQUE(product_id, date)', '同产品同一日期仅可创建一条记录') ] - 重写模型的
read_group方法,自定义查询逻辑:遍历所有产品和查询范围内的所有日期,匹配对应qty值,无匹配记录的组合主动返回qty=0,跳过原生的sum/avg等聚合计算逻辑
- 给原模型添加
- 前端改造
- 继承Odoo原生
PivotRenderer组件,修改单元格渲染规则:非聚合类型的数值单元格替换为数字输入框 - 给输入框绑定
change事件,触发时调用write接口更新对应product_id+date匹配的原记录的qty值,操作完成后局部刷新透视表视图
- 继承Odoo原生
方案二:用可编辑列表视图模拟透视表(开发量更低)
该方案用List视图模拟透视表的行列展示效果,前端改造成本更低,适合日期范围固定的场景
- 新增一个瞬态模型(
TransientModel)作为数据中转,固定字段为product_id,根据你需要展示的日期范围动态生成对应日期的数量字段(例如qty_20211101、qty_20211201) - 重写瞬态模型的
default_get方法,初始化时自动遍历所有产品和日期范围,匹配原模型的qty值,无匹配记录的字段默认赋值为0 - 给瞬态模型配置可编辑List视图,行展示
product_id,列展示所有日期对应的数量字段,设置所有数量字段为可编辑状态 - 重写瞬态模型的
write方法,用户修改单元格值时,自动同步更新到原模型的对应记录,若原模型无对应product_id+date的记录则自动创建新记录
注意事项
- 两种方案都需要保证
product_id+date的组合唯一性,避免出现数据匹配错误、覆盖的问题 - 若选择方案二,动态字段生成需要适配Odoo ORM的字段加载规则,避免运行时出现字段不存在的报错
内容的提问来源于stack exchange,提问作者abdeltif-b
相关产品推荐
相关产品推荐

