Odoo 12中create方法使用问题:新增记录时many2one字段无法保存
看起来你在Odoo自定义模块的create方法里踩了几个常见的坑,导致partner_id字段无法正确保存。咱们一步步拆解问题:
核心错误点
@api.model下的self不是具体记录
用@api.model装饰的create方法中,self代表的是模型类本身(比如vehicle.delivery.transfer模型),而不是已经存在的记录实例。所以self.partner_id.id完全是无效的——模型类根本没有partner_id这个属性,执行到这里要么报错,要么取不到任何值。Search域的语法完全错误
Odoo的search方法要求域格式是[('字段名', '操作符', 值)],你写的['partner_id','in',self.partner_id.id]有两个致命问题:- 字段名没加括号包裹;
in操作符需要搭配列表使用,单个ID应该用=;- 你要搜索
res.partner的记录,应该按id字段搜索,而不是partner_id(这是其他模型关联到res.partner的字段名)。
强行覆盖前端传入的值
你在代码里直接给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

