Odoo计算字段如何在记录加载时完成赋值?
Odoo计算字段如何在记录加载时完成赋值?
嘿,我来帮你捋捋这个问题~你的代码思路是对的,但可以调整几个细节,确保计算字段在记录加载时能稳稳赋值:
首先得搞懂Odoo计算字段的逻辑:store=False的计算字段是「按需触发」的——只有当你访问这个字段的时候(比如打开表单看到它、列表里显示它,或者代码里读取它),Odoo才会调用你的计算方法。所以如果你的视图里已经把e_name加进去了,加载记录时本来就应该自动触发计算,但可能有几个小问题影响了效果:
1. 补全依赖字段,避免更新不及时
你现在的@api.depends只写了'request',但实际你取的是request关联的equipment_id.name。如果request本身没变化,但它关联的设备名称改了,你的e_name不会自动更新。得把依赖补全到最终取值的字段:
# 调整计算字段的依赖 e_name = fields.Char('Nama Asset', store=False, compute="_compute_initial") @api.depends('request.equipment_id.name') def _compute_initial(self): for record in self: # 加个空值判断,避免request为空时报错 record.e_name = record.request.equipment_id.name if record.request else ""
2. 确保字段在视图中被引用
如果你的表单或列表视图里没加e_name字段,Odoo加载记录时不会触发计算逻辑。记得在对应的XML视图里加上这个字段,比如:
<field name="e_name"/>
这样打开表单或加载列表时,Odoo就会自动调用计算方法给e_name赋值。
3. 可选:把字段存到数据库(store=True)
如果你的场景需要这个字段在不显示的地方也有值,或者想减少实时计算的开销,可以把store设为True,这样值会存在数据库里,加载记录时直接读数据库就行:
e_name = fields.Char('Nama Asset', store=True, compute="_compute_initial") @api.depends('request.equipment_id.name') def _compute_initial(self): for record in self: record.e_name = record.request.equipment_id.name if record.request else ""
这种方式要确保依赖字段写对,不然关联字段变化时,数据库里的e_name不会自动更新。
总结一下,确保记录加载时e_name正确赋值的核心就是:补全依赖字段、在视图中引用字段、处理空值避免报错~
内容来源于stack exchange
相关产品推荐
相关产品推荐

