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

自定义移动端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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:12:33