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

如何在销售订单行(Sale Order Line)中通过Height与Width计算total area字段?

嘿,这个需求在Odoo里实现起来很简单,我给你两种常用的方案,你可以根据自己的场景选择:

方法一:使用计算字段(最推荐)

这种方式是Odoo里处理自动计算字段的标准做法,它会在依赖字段变化时自动更新结果,还能选择把计算结果存储到数据库里,效率和体验都拉满。

你只需要在自定义的销售订单行模型代码里这么写:

from odoo import models, fields, api

class SaleOrderLine(models.Model):
    _inherit = 'sale.order.line'

    # 先定义你新增的两个自定义字段
    height = fields.Float(string='Height')
    width = fields.Float(string='Width')
    # 定义总面积字段,设置为计算字段
    total_area = fields.Float(
        string='Total Area',
        compute='_compute_total_area',  # 指定计算用的方法
        store=True,  # 可选:设为True会把结果存到数据库,适合频繁查看的场景
        readonly=True  # 建议设为只读,避免手动修改干扰计算结果
    )

    # 编写计算逻辑的方法
    @api.depends('height', 'width')  # 声明依赖字段,当这两个值变化时自动触发计算
    def _compute_total_area(self):
        for line in self:
            # 处理空值情况,防止出现NaN错误
            if line.height and line.width:
                line.total_area = line.height * line.width
            else:
                line.total_area = 0.0
方法二:使用onchange方法(适合表单实时预览)

如果你只是想在表单编辑时实时看到计算结果,也可以用onchange方法。不过要注意,这种方式默认不会把计算结果持久化到数据库,除非你额外处理,所以一般作为计算字段的补充,或者临时预览场景使用:

from odoo import models, fields, api

class SaleOrderLine(models.Model):
    _inherit = 'sale.order.line'

    height = fields.Float(string='Height')
    width = fields.Float(string='Width')
    total_area = fields.Float(string='Total Area')

    @api.onchange('height', 'width')  # 当这两个字段在表单里被修改时触发
    def _onchange_calculate_area(self):
        if self.height and self.width:
            self.total_area = self.height * self.width
        else:
            self.total_area = 0.0

额外注意事项

  • 别忘了把这三个字段添加到销售订单行的表单视图和树视图里,这样用户才能在界面上看到和编辑它们。
  • 一定要处理空值判断,不然当Height或Width为空时,计算结果会变成NaN,影响用户体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:12:34