您知道{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.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
仅显示验证所生成的日记帐分录。
要更正此问题,我在日记账分录中将Many2one invoice_ids
替换为Many2one invoice_id
,并在account.move
ORM create方法中自动填写。但是此解决方案不会链接数据库中的旧记录,而且我仍然不了解上述代码的行为。
那么,有人对此有解释吗?我想知道为什么inverse_name
会那样。
答案 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',
)