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

Odoo 12中create方法使用问题:新增记录时many2one字段无法保存

问题分析与修复方案

看起来你在Odoo自定义模块的create方法里踩了几个常见的坑,导致partner_id字段无法正确保存。咱们一步步拆解问题:

核心错误点

  1. @api.model下的self不是具体记录
    用@api.model装饰的create方法中,self代表的是模型类本身(比如vehicle.delivery.transfer模型),而不是已经存在的记录实例。所以self.partner_id.id完全是无效的——模型类根本没有partner_id这个属性,执行到这里要么报错,要么取不到任何值。

  2. Search域的语法完全错误
    Odoo的search方法要求域格式是[('字段名', '操作符', 值)],你写的['partner_id','in',self.partner_id.id]有两个致命问题:

    • 字段名没加括号包裹;
    • in操作符需要搭配列表使用,单个ID应该用=;
    • 你要搜索res.partner的记录,应该按id字段搜索,而不是partner_id(这是其他模型关联到res.partner的字段名)。
  3. 强行覆盖前端传入的值
    你在代码里直接给vals['partner_id']赋值,这会把用户在界面上输入的partner_id给覆盖掉——哪怕前端填了正确的内容,也会被你这段错误的代码替换成无效值,最终导致保存后看不到正确数据。

修复方案

根据你的需求,分两种情况处理:

情况1:不需要自动设置partner_id,只想生成序列

直接删掉那行错误的partner_id赋值代码,保留前端传入的值即可:

@api.model
def create(self, vals):
    if vals.get('name', _('New')) == _('New'):
        vals['name'] = self.env['ir.sequence'].next_by_code('vehicle.delivery.transfer')
    # 删掉下面这行错误代码,让前端传入的partner_id正常保存
    # vals['partner_id'] = self.env['res.partner'].search(['partner_id','in',self.partner_id.id])
    return super(VehicleDelivery, self).create(vals)

情况2:需要自动设置partner_id(比如默认值)

如果你确实要在创建时自动填充partner_id,请修正逻辑,比如设置为当前用户的关联合作伙伴(确保只有前端没传值时才覆盖):

@api.model
def create(self, vals):
    if vals.get('name', _('New')) == _('New'):
        vals['name'] = self.env['ir.sequence'].next_by_code('vehicle.delivery.transfer')
        # 只有前端没传入partner_id时,才自动设置为当前用户的合作伙伴
        if not vals.get('partner_id'):
            vals['partner_id'] = self.env.user.partner_id.id
    return super(VehicleDelivery, self).create(vals)

额外检查

确保你的模型里正确定义了partner_id字段,比如:

partner_id = fields.Many2one('res.partner', string='Partner', required=False)

如果字段设置了readonly=True但前端没有设置可编辑权限,也会导致无法保存,但根据你描述的“界面显示已填入正确数据”,这个可能性不大。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:10:07