您了解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.invoice
和account.move
之间的逻辑应该是1:1,但是对于这种情况,我可以使用1:N,因为One2many只是为用户提供信息和只读。所以这个似乎工作正常,我能够在日记帐分录中看到发票,但过了一段时间后,我意识到我已经用该代码破坏了工作流程。
这就是现在发生的事情,我用例子来描述:
我希望日记帐分录的invoice_ids
字段仅显示其验证生成该日记帐分录的发票,因为发票中的move_id
仅显示验证生成的日记帐分录。
为了纠正这个问题,我在日记条目中用Many2one invoice_ids
替换了One2many 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认为我想用该值填充我的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',
)