Odoo 11中inverse_name的异常行为

时间:2019-04-30 09:35:58

标签: python-3.x odoo odoo-11

您知道{2}字段可用的inverse_name参数。它只是告诉Odoo知道相关联模型中的必填Many2one字段知道要显示的记录。

在标准模块帐户中,在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_ids替换为Many2one invoice_id,并在account.move ORM create方法中自动填写。但是此解决方案不会链接数据库中的旧记录,而且我仍然不了解上述代码的行为。

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

1 个答案:

答案 0 :(得分:2)

在浪费大量时间填写日志消息后,我发现了我不幸的问题。

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

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

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

我想那真是太倒霉了。

最后,我修改了它,只需修改One2many字段的技术名称,以免将Odoo弄糊涂:

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