You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:46:25