如何重写Odoo的create函数?关联模型状态更新问题求助
嘿,我来帮你搞定这个Odoo的问题!你说的在创建Tour时把关联Transport的est_dispo设为False的需求,重写create方法确实是正确的思路,没成功大概率是几个细节没处理到位,我给你拆解清楚解决步骤和代码示例:
核心解决思路与代码实现
1. 先确保create方法的正确结构
Odoo里重写create方法必须先调用父类的create逻辑,拿到已经持久化的Tour记录,再去操作关联的Transport——如果你先改Transport再调用super,那时候Tour还没创建,关联关系可能还没生效。
2. 精准获取并更新关联的Transport
假设你的Tour模型里和Transport的关联是many2one类型的transport_id字段,下面是完整的代码示例:
from odoo import models, fields, api class Tour(models.Model): _name = 'tour' _description = 'Tour' # 这里假设你的关联字段是many2one到transport模型 transport_id = fields.Many2one('transport', string='关联交通工具') # 其他业务字段... @api.model def create(self, vals): # 第一步:先调用父类create,生成并返回新的Tour记录 new_tour = super(Tour, self).create(vals) # 第二步:检查是否关联了有效的Transport记录 if new_tour.transport_id: # 用write方法更新Transport的est_dispo字段为False new_tour.transport_id.write({'est_dispo': False}) # 也可以用直接赋值+save的方式,不过write更符合Odoo ORM的最佳实践 # new_tour.transport_id.est_dispo = False # new_tour.transport_id.save() # 一定要返回新创建的tour记录,不然Odoo后续流程会出错 return new_tour
3. 特殊场景的处理
如果你的Tour和Transport是many2many关联(比如一个Tour用多个Transport),只需要稍微修改下逻辑:
if new_tour.transport_ids: # 直接对整个记录集调用write,Odoo会批量更新 new_tour.transport_ids.write({'est_dispo': False})
几个容易踩坑的点
- 确认Transport模型的
est_dispo字段没有设置readonly=True,否则即使调用write也不会生效; - 检查当前操作的用户是否有修改Transport模型的权限,没有的话会静默失败(可以在调试模式下查看权限设置);
- 如果需要在删除Tour时把Transport的
est_dispo改回True,可以用同样的思路重写unlink方法。
内容的提问来源于stack exchange,提问作者Rad304
相关产品推荐
相关产品推荐

