Odoo10打开透视表视图报错:ProgrammingError: 列new_table_report.id不存在
解决Odoo透视表视图报错:ProgrammingError: column new_table_report.id does not exist
看起来你在配置Odoo报表视图的时候踩了个常见的坑——这个错误的核心原因很直接:你的报表视图new_table_report里没有包含id字段,但Odoo的ORM(尤其是透视表、看板这类依赖单条记录标识的视图)必须要有一个唯一的id字段来识别每条记录。
咱们来拆解你的代码问题:你创建的视图是基于子查询sub生成的,但在子查询的SELECT语句里,你只把eq.id命名为equipment(从代码片段里的eq.id as equipmen...能看出来),没有给视图提供一个名为id的字段,这就导致Odoo在渲染透视表时找不到它需要的主键标识。
解决方案:给视图添加唯一的id字段
有两种简单的方式可以解决这个问题,你可以根据自己的数据情况选择:
方式1:用行号生成唯一id
如果你的子查询结果没有天然的唯一字段(或者不想用现有字段作为id),可以用row_number()函数生成一个自增的唯一id,修改后的代码如下:
@api.model_cr def init(self): tools.drop_view_if_exists(self._cr, 'new_table_report') self._cr.execute(""" CREATE or REPLACE VIEW new_table_report AS ( SELECT sub.*, (SELECT name FROM maintenance_rating_score_range WHERE (sub.average_deviation >= from_score and sub.average_deviation <= to_score) ) as rating FROM( SELECT row_number() OVER () AS id, -- 新增这一行,生成唯一标识id eq.id as equipment_id, -- 保留设备ID,改名更清晰 -- 这里放你原来的其他字段,比如average_deviation等 eq.average_deviation, -- 其他需要的字段... FROM maintenance_equipment eq -- 假设你的设备表是这个表名 -- 你的JOIN、WHERE等条件 ) sub ) """)
方式2:复用现有唯一字段作为id
如果你的子查询里的eq.id本身是唯一的(比如设备ID是唯一的),可以直接把它同时作为视图的id和设备标识字段:
@api.model_cr def init(self): tools.drop_view_if_exists(self._cr, 'new_table_report') self._cr.execute(""" CREATE or REPLACE VIEW new_table_report AS ( SELECT sub.*, (SELECT name FROM maintenance_rating_score_range WHERE (sub.average_deviation >= from_score and sub.average_deviation <= to_score) ) as rating FROM( SELECT eq.id as id, -- 把设备ID作为视图的id字段 eq.id as equipment_id, -- 同时保留设备ID字段供使用 eq.average_deviation, -- 其他需要的字段... FROM maintenance_equipment eq -- 你的JOIN、WHERE等条件 ) sub ) """)
额外注意:确保报表模型定义了id字段
如果你是用Odoo的报表模型(_auto = False的模型)来关联这个视图,还要确保模型里已经定义了id字段:
class NewTableReport(models.Model): _name = 'new.table.report' _auto = False _description = 'New Table Report' id = fields.Integer(string='ID', readonly=True) equipment_id = fields.Many2one('maintenance.equipment', string='Equipment', readonly=True) rating = fields.Char(string='Rating', readonly=True) average_deviation = fields.Float(string='Average Deviation', readonly=True) # 其他对应的字段...
最后,修改完代码后记得升级你的模块,这样Odoo会重新执行init方法创建视图,之后再打开透视表应该就不会报错了。
内容的提问来源于stack exchange,提问作者user3583681
相关产品推荐
相关产品推荐

