Odoo 10导入CSV时sq_cost字段关联计算不执行问题求助
解决Odoo 10 CSV导入时
sq_cost不触发standard_price计算的问题 这问题挺典型的——@api.onchange装饰的方法只在前端表单手动交互时触发,CSV导入是后台直接对数据库做批量操作,不会走前端的交互流程,自然就不会执行你的计算逻辑啦。给你两个靠谱的解决方案:
方案1:使用字段依赖自动计算(推荐)
把计算逻辑改成基于字段依赖的方式,这样不管是手动输入还是CSV导入,只要依赖的字段发生变化,standard_price都会自动更新。替换你原来的_onchange_sq_cost方法,改成下面这样:
from odoo import models, fields, api class YourProductModel(models.Model): _inherit = 'product.product' # 假设你是继承产品模型,根据实际业务调整 sq_cost = fields.Float(string='Square Cost') sqyards_per_box = fields.Float(string='Square Yards per Box') standard_price = fields.Float(string='Standard Price') @api.depends('sq_cost', 'sqyards_per_box') def _compute_standard_price(self): for record in self: if record.sqyards_per_box and record.sq_cost: record.standard_price = record.sqyards_per_box * record.sq_cost else: record.standard_price = 0.0 # 也可以根据业务需求设置其他默认值
设置完成后,只要sq_cost或sqyards_per_box的值被修改(包括CSV导入时的批量修改),Odoo会自动触发_compute_standard_price方法更新standard_price。
方案2:重写create和write方法强制计算
如果你不想用计算字段的方式,也可以重写模型的创建和写入方法,在保存记录前手动执行计算逻辑:
from odoo import models, fields, api class YourProductModel(models.Model): _inherit = 'product.product' sq_cost = fields.Float(string='Square Cost') sqyards_per_box = fields.Float(string='Square Yards per Box') @api.model def create(self, vals): # 创建记录时计算standard_price if vals.get('sq_cost') and vals.get('sqyards_per_box'): vals['standard_price'] = vals['sqyards_per_box'] * vals['sq_cost'] return super(YourProductModel, self).create(vals) def write(self, vals): # 写入记录时,如果sq_cost或sqyards_per_box有变化,重新计算 if 'sq_cost' in vals or 'sqyards_per_box' in vals: for record in self: sq_cost = vals.get('sq_cost', record.sq_cost) sqyards = vals.get('sqyards_per_box', record.sqyards_per_box) record.standard_price = sq_cost * sqyards return super(YourProductModel, self).write(vals)
这个方法的好处是能更灵活地控制计算时机,但要注意处理空值的情况,避免出现计算错误。
修改完代码后记得升级你的模块,再测试CSV导入,就能看到standard_price自动计算生效啦!
内容的提问来源于stack exchange,提问作者user2379186
相关产品推荐
相关产品推荐

