Odoo 11中inverse_name的意外行为

问题描述 投票:1回答:1

您了解inverse_name参数,可用于One2many字段。它只是告诉Odoo哪个是相关comodel中的强制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替换了One2many invoice_id,并在account.move ORM创建方法中自动填写。但是这个解决方案没有链接数据库中的旧记录,我仍然不理解上述代码的行为。

那么,有没有人对此有解释?我想知道为什么inverse_name表现得那样。

python-3.x odoo odoo-11
1个回答
2
投票

在浪费了大量时间用核心消息填充核心后,我发现了我不幸的问题。

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

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

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

我猜这是运气非常糟糕。

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

validated_invoice_ids = fields.One2many(
    comodel_name='account.invoice',
    inverse_name='move_id',
    string='Invoices whose validation generated this journal entry',
)
© www.soinside.com 2019 - 2024. All rights reserved.