您了解可用于 One2many 字段的 inverse_name
参数。它只是告诉 Odoo 相关 comodel 中哪个是强制的 Many2one 字段,以了解要显示的记录。
在标准模块account中,在account.invoice
模型中,有一个名为move_id
的Many2one字段。它与 account.move
模型相关,其目的是在验证此发票时显示为发票生成的日记帐分录。
我唯一想做的就是在日记帐分录表单 (account.move
) 中显示其验证已生成该日记帐分录的发票 (account.invoice
) 。所以这对我来说看起来很简单,我刚刚在 account.move
模型中创建了关系的其他部分:
invoice_ids = fields.One2many(
comodel_name='account.invoice',
inverse_name='move_id',
string='Invoices whose validation generated this journal entry',
)
account.invoice
和 account.move
之间的逻辑应该是 1:1,但对于这种情况,我可以使用 1:N,因为 One2many 只是提供信息,并且对用户只读。所以这个似乎工作正常,我能够在日记帐分录中看到发票,但过了一会儿我意识到我已经用该代码破坏了工作流程。
这就是现在发生的情况,我用例子描述一下:
我创建并验证发票SALE/INV/00001。
验证生成日记帐分录2019/00001。我可以在发票表单中看到此日记帐分录,并且可以在日记帐分录表单中(在我创建的 One2many 中)看到发票。对。
我支付了发票,但一切都崩溃了。付款生成日记帐分录 2019/00002,这没问题,但现在,在发票 SALE/INV/00001 中,我看到的是此日记帐分录,而不是 2019/00001,这是错误的,如果我转到日记帐分录的表单 2019/00001,我创建的用于显示相关发票的 One2many 字段为空,而付款生成的日记帐分录中的一个显示 SALE/INV/00001,而它本应为空。
我希望日记帐分录的 invoice_ids
字段仅显示验证生成该日记帐分录的发票,因为发票中的 move_id
仅显示验证生成的日记帐分录。
为了纠正这个问题,我在日记条目中将 One2many invoice_ids
替换为 Many2one invoice_id
,并在 account.move
中自动填写此内容> ORM 创建方法。但这个解决方案没有链接数据库中的旧记录,我仍然不明白上述代码的行为。
那么,有人能解释一下吗?我想知道为什么 inverse_name
会有这样的行为。
最佳答案
在浪费了大量时间用日志消息填充核心之后,我发现了我不幸的问题。
当您通过标准方法支付发票时(单击注册付款按钮),将打开account. payment
模型的弹出窗口。该模型已经有一个名为 invoice_ids
的字段,Odoo 正在使用打开弹出窗口的操作上下文,以使用当前发票自动填充该字段:
<field name="context">{'default_invoice_ids': [(4, active_id, None)]}</field>
接受付款后,将调用 account.move
create 方法来生成付款日记帐分录。问题是操作的上下文仍然保留在该调用中,这意味着 Odoo 认为我想用该内容填充 account.move
的自定义字段 invoice_ids
值(始终是事件 ID,我们保留的发票)...但这不是事实。
我想这真是运气不好。
最后我修复了它,只是修改了 One2many 字段的技术名称,以避免 Odoo 混淆:
validated_invoice_ids = fields.One2many(
comodel_name='account.invoice',
inverse_name='move_id',
string='Invoices whose validation generated this journal entry',
)
关于python-3.x - Odoo 11 中 inverse_name 的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55918002/