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.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_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',
)
您了解 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.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_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',
)