Odoo 11中onchange动作引发psycopg2.ProgrammingError:关系_unknown不存在
解决Odoo升级时
psycopg2.ProgrammingError: relation "_unknown"不存在的问题 从你提供的报错堆栈和代码来看,这个错误并不是由你的onchange方法直接导致的,根源出在模型字段的定义上。报错发生在update_db_foreign_keys步骤,说明Odoo在尝试创建外键约束时,找不到对应的关联表_unknown——这通常是因为某个字段被错误定义为关联类型(比如Many2one/One2many/Many2many),但没有正确指定关联的模型名称。
排查和解决步骤:
- 检查所有字段的定义:仔细核对你的模型中所有字段,尤其是关联类型的字段。如果某个字段是Many2one,确保你指定了正确的
comodel_name参数;如果是Char类型(比如你的login和email),不要误写成关联类型。
举个反例:如果错误地把email字段定义成这样,就会触发这个错误:
正确的Char字段定义应该是:# 错误示例:缺少comodel_name的Many2one字段 email = fields.Many2one(string='Email')login = fields.Char(string='Login') email = fields.Char(string='Email') - 临时注释onchange方法测试:虽然你的onchange代码逻辑很简单(
self.email = self.login),但可以先注释掉这段代码,重新升级模块。如果升级成功,再逐步排查onchange中是否有隐含的模型访问问题;如果还是报错,那肯定是字段定义的问题。 - 检查模块的语法错误:确保模型文件中没有语法错误(比如缺少逗号、括号不匹配),这些小错误可能导致Odoo解析字段定义时出现异常,进而误判字段类型。
- 用Odoo Shell验证字段:启动Odoo Shell,执行以下命令查看模型字段的实际定义,确认login和email的类型正确:
然后在shell中:odoo-shell -d your_database_name
查看返回结果中的env['your.model.name'].fields_get(['login', 'email'])type字段,确保都是char而不是many2one或其他关联类型。
补充说明:
你提到更换其他字段测试仍出现相同错误,这进一步说明问题不在特定字段的onchange逻辑,而是模型中存在一个通用的字段定义错误,导致Odoo在初始化模型时尝试创建无效的外键约束。
内容的提问来源于stack exchange,提问作者Daniel Ruiz
相关产品推荐
相关产品推荐

