自定义移动端App调用Odoo注册接口触发psycopg2.UndefinedFunction报错
问题根因
报错是PostgreSQL强类型校验机制触发的:company_id是存储整数ID的关联字段,最终生成的SQL里出现了p.company_id=false的逻辑,拿整数和布尔值做相等判断,PostgreSQL不支持这类隐式类型转换,直接抛出类型不存在的错误。
这个错误90%以上的触发场景是调用ORM方法时缺失请求上下文,导致取当前公司ID时拿到了布尔值False,拼接到SQL里就触发报错;剩下的场景是自定义代码/第三方模块写搜索domain时,把company_id的判断值错写为布尔类型,或者重写ir.property的_get_multi方法时传参类型错误。
修复方案
- 禁止直接实例化控制器类调用方法:
AuthSignupHome的do_signup方法强依赖HTTP请求上下文,直接写AuthSignupHome().do_signup(user)属于错误调用方式,会丢失环境里的公司、用户、上下文参数,触发类型错误。如果要复用注册逻辑,要么走Odoo原生的/web/signup路由转发请求,要么直接调用ORM层的用户创建方法,不要绕控制器。 - 直接创建用户的正确写法参考:
# 绑定管理员用户环境,显式传入允许的公司ID,避免上下文缺失 admin_env = request.env(user=request.env.ref('base.user_admin').id, context={ 'allowed_company_ids': [request.env.company.id], 'no_reset_password': True }) user_vals = { 'name' : user_info['name'], 'phone': user_info['phone'], 'email': 'test@example.com', 'login': user_info['phone'], 'password': password, } # ORM层create不需要传confirm_password字段,该字段只在控制器表单校验用 new_user = admin_env['res.users'].sudo().create(user_vals)
- 全局排查代码里的domain写法:搜索所有包含
company_id=False的过滤规则,对于res.users、res.partner、ir.property这类存公司ID的整数字段,空值判断统一用company_id=None,不要用布尔值False,避免ORM生成错误SQL。 - 如果有自定义模块重写了
ir.property的_get_multi方法,检查SQL拼接逻辑:当公司参数为空时,不要直接传入Python的布尔值False,替换为None,ORM会自动生成正确的IS NULL判断,不会出现=false的语法错误。
内容的提问来源于stack exchange,提问作者Hari Prasad
相关产品推荐
相关产品推荐

