Вы знаете о параметре inverse_name
, доступном для полей One2many. Он просто сообщает Odoo, что является обязательным полем Many2one в соответствующей комодели, чтобы знать, какие записи нужно отображать.
В стандартном модуле account в модели account.invoice
есть поле Many2one с именем move_id
. Он связан с моделью 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, которое я создал для отображения соответствующего счета-фактуры, будет пустым, тогда как одна запись в журнале, созданная при оплате, показывает ПРОДАЖА / ИНВ / 00001, тогда как она должна быть пустой.
Я ожидал, что поле записи журнала invoice_ids
будет отображать только счета, проверка которых сгенерировала эту запись журнала, поскольку move_id
в счетах показывает только записи журнала, созданные в результате проверок.
Чтобы исправить это, я заменил One2many invoice_ids
на Many2one invoice_id
в записи журнала и автоматически заполняю его в account.move
методе создания ORM. Но это решение не связывает старые записи в базе данных, и я до сих пор не понимаю поведение описанного выше кода.
Итак, есть ли у кого-нибудь этому объяснение? Я хотел бы знать, почему inverse_name
так себя ведет.
default_
проблеме, но мне было лень ее искать. Эта тема немного обсуждается в выпусках Odoo 30.04.2019