Nano Hash - криптовалюты, майнинг, программирование

Неожиданное поведение inverse_name в Odoo 11

Вы знаете о параметре 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 просто информативен и предназначен только для чтения для пользователей. Таким образом, этот, казалось, работал нормально, я мог видеть счет в записи журнала, но через некоторое время я понял, что разрушил рабочий процесс с помощью этого кода.

Вот что сейчас происходит, описываю на примерах:

  1. Я создаю и подтверждаю счет SALE / INV / 00001.

  2. В результате проверки создается запись журнала 2019/00001. Я могу видеть эту запись журнала в форме счета-фактуры, и я могу видеть счет-фактуру в форме записи журнала (в созданном мной One2many). Верно.

  3. Я оплачиваю счет, и здесь все ломается. Платеж создает запись журнала 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 так себя ведет.

30.04.2019

  • Если он действительно изменяет move_id при оплате в этом счете, попробуйте отладить этот процесс записи, чтобы увидеть, откуда это происходит. 30.04.2019
  • @CZoellner да, после долгой отладки я смог найти проблему! 30.04.2019

Ответы:


1

Потратив много времени на заполнение ядра сообщениями журнала, я обнаружил свою досадную проблему.

Когда вы оплачиваете счет стандартным способом (нажав кнопку Зарегистрировать платеж), открывается всплывающее окно модели account.payment. В этой модели уже есть поле с именем invoice_ids, и Odoo использует контекст действия, которое открывает всплывающее окно, чтобы автоматически заполнить его текущим счетом:

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

Когда платеж принят, выполняется вызов account.move метода create для создания записи журнала платежей. Проблема в том, что контекст действия по-прежнему остается в этом вызове, а это означает, что Odoo считает, что я хочу заполнить свое настраиваемое поле invoice_ids of 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',
)
30.04.2019
  • ха-ха, да, я догадался о какой-то default_ проблеме, но мне было лень ее искать. Эта тема немного обсуждается в выпусках Odoo 30.04.2019
  • LoL, это действительно неудача 23.05.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..