inverse_name 在 Odoo 11 中的意外行为

Unexpected behaviour of inverse_name in Odoo 11

您了解 inverse_name 参数,可用于 One2many 字段。它只是告诉 Odoo 在相关的 commodel 中哪个是强制性的 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.invoiceaccount.move 之间的逻辑应该是 1:1,但对于这种情况,我可以使用 1:N,因为 One2many 只是提供信息并且对用户来说是只读的。所以这个似乎工作正常,我能够在日记账分录中看到发票,但过了一会儿我意识到我已经用那个代码破坏了工作流程。

现在是这样的,我举例说明一下:

  1. 我创建并验证发票 SALE/INV/00001

  2. 验证生成日记帐分录 2019/00001。我可以在发票表格中看到这个日记帐分录,我可以在日记帐分录表格中看到发票(在我创建的 One2many 中)。对了。

  3. 我支付了发票,这就是一切都崩溃的地方。付款生成日记帐分录 2019/00002,没问题,但是现在,在发票 SALE/INV/00001 中,我看到了这个日记帐条目而不是 2019/00001,这是错误的,如果我转到日记条目的形式 2019/00001,One2many 字段我已创建以显示相关发票为空,而付款生成的日记帐分录中显示 SALE/INV/00001,而应为空。

我希望日记帐分录的 invoice_ids 字段仅显示其验证生成该日记帐分录的发票,因为发票中的 move_id 仅显示验证生成的日记帐分录。

为了更正这个问题,我在日记条目中用 Many2one invoice_id 替换了 One2many invoice_ids,并且我在 account.move ORM 创建方法中自动填写了它。但是这个解决方案没有 link 数据库中的旧记录,我仍然不明白上面描述的代码的行为。

所以,有人对此有解释吗?我想知道为什么 inverse_name 会这样。

在浪费了很多时间用日志消息填充内核之后,我发现了我不幸的问题。

当您通过标准方法支付发票时(单击 注册付款 按钮),将打开一个 account.payment 模型的弹出窗口。该模型已经有一个名为 invoice_ids 的字段,Odoo 使用打开弹出窗口的操作上下文自动填充当前发票:

<field name="context">{'default_invoice_ids': [(4, active_id, None)]}</field>

接受付款后,将调用 account.move 创建方法以生成付款日记帐分录。问题是操作的上下文仍然保留在该调用中,这意味着 Odoo 认为我想用该值(始终是活动 ID)填充 account.move 的自定义字段 invoice_ids ,我们一直开着的发票)...但事实并非如此。

估计运气太差了

最后我修复了它只是修改了我的 One2many 字段的技术名称以避免混淆 Odoo:

validated_invoice_ids = fields.One2many(
    comodel_name='account.invoice',
    inverse_name='move_id',
    string='Invoices whose validation generated this journal entry',
)