如何将采购订单行的Many2one字段传递至会计凭证行
问题分析与解决思路
你当前的方案有两个核心错误,导致同步失效:
1. 重写了错误模型的方法
_prepare_account_move_line 方法的定义主体是 purchase.order.line,而非 account.move.line。你在 account.move.line 里重写这个方法,根本不会被采购订单生成凭证的流程调用。
2. 字段引用逻辑错误
你写的 self.order_id.task_id.id 是去取采购订单(purchase.order)的 task_id,但你定义的 task_id 是在采购订单行(purchase.order.line)上的,应该直接引用当前行的 task_id。
修正后的代码
第一步:修改采购订单行模型,添加字段并重写正确的方法
class PurchaseLine(models.Model): _inherit = 'purchase.order.line' task_id = fields.Many2one('project.task', string='Rubriques', store=True) def _prepare_account_move_line(self, move=False): # 调用父类方法获取基础凭证行数据 res = super()._prepare_account_move_line(move) # 将当前采购订单行的task_id同步到凭证行参数中 if self.task_id: res['task_id'] = self.task_id.id return res
第二步:仅在会计凭证行模型添加字段即可
class AccountMoveLine(models.Model): _inherit = "account.move.line" task_id = fields.Many2one('project.task', string='Rubriques', store=True)
额外检查点
- 确保你的模块在
__manifest__.py中声明了对purchase、account、project模块的依赖 - 升级模块后,重新生成采购订单的会计凭证(已存在的旧凭证不会自动更新,需要删除后重新生成)
- 确认采购订单行的
task_id字段已经正确赋值
内容的提问来源于stack exchange,提问作者RIzu
相关产品推荐
相关产品推荐

