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

如何重写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:52:44