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

Odoo13如何解决psycopg2.OperationalError无法更新sale_report视图错误

错误成因

Odoo的sale.report是基于SQL生成的数据库视图,不是实际存储数据的物理表,底层SQL包含GROUP BY逻辑,PostgreSQL原生不允许直接更新这类带聚合的视图。
你在继承sale.report时给三个关联字段加了store="True"属性,当你编辑res.partner的地址字段时,Odoo的ORM检测到这些字段被sale.report的存储型关联字段引用,会自动尝试同步更新sale.report的对应字段值,触发了对只读视图的写操作,所以抛出该错误。

解决方法

你不需要给sale.report的这三个字段加store属性,因为sale.report的所有字段值都是通过_query方法定义的SQL视图动态查询得到的,存储属性完全多余。修改方案如下:

  1. 移除sale.report三个字段的store="True"配置,修改后的代码如下:
class SaleReport(models.Model):
    _inherit = 'sale.report'
    
    shipping_state_id = fields.Many2one('res.country.state', string='State', related="partner_id.state_id")
    shipping_municipality_id = fields.Many2one('res.country.state.municipality', string='Municipality', related="partner_id.municipality_id")
    shipping_neighbourhood_id = fields.Many2one('res.country.state.municipality.neighbourhood', string='Neighbourhoods', related="partner_id.neighbourhood_id")

    def _query(self, with_clause='', fields={}, groupby='', from_clause=''):
        fields['shipping_state_id'] = ", s.shipping_state_id as shipping_state_id"
        fields['shipping_municipality_id'] = ", s.shipping_municipality_id as shipping_municipality_id"
        fields['shipping_neighbourhood_id'] = ", s.shipping_neighbourhood_id as shipping_neighbourhood_id"
        groupby += ', s.shipping_state_id, s.shipping_municipality_id, s.shipping_neighbourhood_id'
        return super(SaleReport, self)._query(with_clause, fields, groupby, from_clause)
  1. 升级你开发的自定义模块,让Odoo重新生成sale_report视图,清除之前的字段存储逻辑即可。
    修改后不会影响你按省份、城市、社区分组统计销售数据的功能,因为你已经在_query方法中正确添加了字段查询和分组规则。

内容的提问来源于stack exchange,提问作者Ernesto Ruiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:15:02