如何在Odoo 9的stock.quant中添加字段并同步采购产品描述
解决Odoo 9中Stock Quant自动同步采购/询价单产品描述的问题
嘿,我来帮你搞定这个需求!首先得理清楚Odoo里的数据流:stock.quant是入库操作完成后生成的库存批次记录,它和stock.move(库存移动)关联,而采购入库的stock.move又能追溯到对应的采购订单行(purchase.order.line)。咱们的核心就是把采购/询价单里填的产品描述,通过这条链路自动同步到stock.quant的designation2字段里。
第一步:优化字段定义(可选但推荐)
你现在给designation2加了required=True,但如果是自动赋值的话,手动创建库存批次时容易触发必填校验报错。建议先把必填属性去掉,等逻辑跑通后再根据实际需求调整:
from openerp.osv import fields, osv from openerp import tools import openerp.addons.decimal_precision as dp from openerp.tools.translate import _ class StockQuantTreeDesignation(osv.osv): _inherit = 'stock.quant' _columns = { 'designation2': fields.char(string="Désignation", select=True), }
第二步:实现自动赋值的核心逻辑
这里给你两种靠谱的实现方式,选哪种都能满足需求:
方式一:在Stock Move完成时同步到Quant
因为stock.quant是由stock.move触发生成的,所以可以在库存移动状态变为done(入库完成)时,把采购订单行的描述同步过去。在你的模块里新增或修改Python代码:
class StockMove(osv.osv): _inherit = 'stock.move' def write(self, cr, uid, ids, vals, context=None): # 先调用父类的write方法完成基础状态更新 res = super(StockMove, self).write(cr, uid, ids, vals, context=context) # 当移动状态更新为done时,同步采购描述到关联的quant if 'state' in vals and vals['state'] == 'done': for move in self.browse(cr, uid, ids, context=context): # 只处理来自采购订单的库存移动 if move.purchase_line_id: # 获取采购订单行里填写的产品描述 po_line_desc = move.purchase_line_id.name # 找到该move对应的所有quant记录 quant_ids = self.pool.get('stock.quant').search(cr, uid, [ ('move_id', '=', move.id) ], context=context) # 批量更新designation2字段 if quant_ids: self.pool.get('stock.quant').write(cr, uid, quant_ids, { 'designation2': po_line_desc }, context=context) return res
方式二:直接在Quant创建时赋值
另一种思路是在stock.quant创建的瞬间,直接从关联的stock.move里追溯采购订单的描述:
class StockQuantTreeDesignation(osv.osv): _inherit = 'stock.quant' _columns = { 'designation2': fields.char(string="Désignation", select=True), } def create(self, cr, uid, vals, context=None): # 创建quant前,先检查是否关联了库存移动 if vals.get('move_id'): move = self.pool.get('stock.move').browse(cr, uid, vals['move_id'], context=context) # 如果是采购入库的move,就把采购行的描述赋值给designation2 if move.purchase_line_id: vals['designation2'] = move.purchase_line_id.name # 调用父类方法完成quant创建 return super(StockQuantTreeDesignation, self).create(cr, uid, vals, context=context)
第三步:模块配置与测试
- 记得在你的模块的
__openerp__.py里添加依赖,确保模块加载顺序正确:
'depends': ['base', 'stock', 'purchase'],
- 升级模块后,按这个流程测试:
- 创建询价单(RFQ),填写自定义的产品描述
- 确认询价单成为正式采购订单
- 执行采购入库操作(生成收货单并验证)
- 打开库存批次(Stock Quant)列表,查看
designation2字段,应该已经自动填充了采购订单里的描述!
补充小提示
- 如果你的需求是同步产品模板的默认名称,而非采购订单行自定义的描述,可以把代码里的
move.purchase_line_id.name换成move.product_id.display_name或者move.product_id.name。 - 对于已经存在的库存批次记录,你可以通过Odoo的批量更新功能,手动关联采购订单行的描述来补全数据。
内容的提问来源于stack exchange,提问作者Dhouha
相关产品推荐
相关产品推荐

