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视图动态查询得到的,存储属性完全多余。修改方案如下:
- 移除
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)
- 升级你开发的自定义模块,让Odoo重新生成
sale_report视图,清除之前的字段存储逻辑即可。
修改后不会影响你按省份、城市、社区分组统计销售数据的功能,因为你已经在_query方法中正确添加了字段查询和分组规则。
内容的提问来源于stack exchange,提问作者Ernesto Ruiz
相关产品推荐
相关产品推荐

