You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Odoo计算字段空值忽略及计算方法动态切换技术咨询

关于Odoo计算字段的两个问题解答

问题2:字符型计算字段空值返回"False",且代码导致字段被错误修改

首先得指出你现有代码里的关键问题:你写了self.model= False,这行代码直接修改了model字段的数据库值,而不是仅仅在计算name的时候忽略它——这就是为什么当model为False时,所有字段都变成False的原因!计算字段的职责应该是只赋值给目标字段(这里是name,绝对不能修改用来计算的源字段。

优化后的解决方案

我们可以换个思路:先把需要用到的字段列出来,然后过滤掉空值的字段,最后把非空的字段值拼接起来,这样自动就忽略了所有值为False或空的字段,也不会出现"False"字符串。同时根据model的状态切换要包含的字段,顺便解决你的第一个问题。

@api.depends('car','model','dsc','drc','year','org')
def _compute_amount(self):
    # 遍历记录集中的每一条记录
    for record in self:
        # 根据model的状态,选择要包含的字段
        if not record.model or not record.model.name:
            # 当model为空时,不包含model字段
            target_fields = [record.car, record.dsc, record.drc, record.year, record.org]
        else:
            # model有值时,包含model字段
            target_fields = [record.car, record.model, record.dsc, record.drc, record.org, record.year]
        
        # 过滤出有值的字段name,避免空值或"False"
        valid_parts = [field.name for field in target_fields if field and field.name]
        
        # 用空格拼接所有有效部分,得到最终的name
        record.name = ' '.join(valid_parts)

代码解释

  1. 避免修改源字段:全程没有修改model或其他源字段的值,只对计算字段name赋值,符合Odoo计算字段的设计规范。
  2. 动态切换计算逻辑:通过判断record.model是否存在且有值,切换要包含的字段列表,完美解决你第一个问题里“关联字段为False时切换计算方法”的需求。
  3. 自动过滤空值:用列表推导式过滤掉空字段(if field and field.name),确保只有真正有值的字段才会被拼接,彻底解决空字段返回"False"的问题。
  4. 更简洁的拼接方式:用' '.join()代替硬编码的加号拼接,不仅代码更整洁,还能避免出现多余的空格(比如某个字段为空时不会留下空白)。

问题1:计算字段中循环并根据关联字段状态切换计算方法

其实上面的代码已经帮你解决了这个问题:在遍历每条记录的时候,我们通过if not record.model or not record.model.name判断关联字段的状态,然后选择不同的字段列表来计算name——这就是“切换计算方法”的核心逻辑。

如果你的场景更复杂(比如不仅仅是切换字段列表,而是完全不同的计算逻辑),可以扩展这个判断:

@api.depends('your_related_field', ...)
def _compute_your_field(self):
    for record in self:
        if not record.your_related_field:
            # 关联字段为False时的计算逻辑
            record.your_computed_field = 逻辑A
        else:
            # 关联字段为True时的计算逻辑
            record.your_computed_field = 逻辑B

额外注意点

  • 旧版本的@api.one装饰器已经被Odoo废弃了,现在只需要用@api.depends配合遍历记录集(for record in self)就可以了,这样的写法兼容Odoo 10及以后的版本。

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

火山引擎 最新活动