如何在销售订单行(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
相关产品推荐
相关产品推荐

