Блог

Обзор реляционных полей в Odoo 19

post-title

Реляционные поля в Odoo используются для установления связей между различными моделями. Они играют решающую роль, поскольку создание связей между моделями часто необходимо для эффективного проектирования и внедрения бизнес-процессов в Odoo.

В этом блоге мы рассмотрим различные типы реляционных полей в Odoo.

Эти поля служат ключевым механизмом, обеспечивающим бесшовную интеграцию между различными моделями, что делает их одной из самых важных и мощных функций Odoo.

В Odoo существует три типа реляционных полей:

  1. Поле Many2one
  2. Поле "Один ко многим"
  3. Поле Many2man

Many2one Fields

Поле Many2one создает связь, в которой запись в текущей модели связана с одной записью в другой модели, известной как сомодель. По общепринятой практике, имена полей Many2one обычно заканчиваются suffix _id.

Вы можете определить поле Many2one в своей модели, используя следующий синтаксис:

field_id = fields.Many2one('comodel.name', 'Field Name')

Значение поля Many2one может быть либо пустым (нет записи), либо содержать одну запись. В базе данных столбец, представляющий это поле, имеет целочисленный тип и хранит идентификатор связанной записи из модели.

Вы также можете легко получить доступ к полям связанной записи, используя следующий синтаксис:

field_id.name

Например, если вы хотите связать свою модель с моделью ' product.product ' и назвать поле ' Product ', вы можете определить поле Many2one следующим образом:

product_id = fields.Many2one('product.template', string='Product')

Для получения названия продукта, которое хранится в сомодельном поле как символьное поле 'name', можно использовать следующий способ:

product_id.name

Аналогично, чтобы получить категорию товара, определенную как поле ' categ_id ' в модели Many2one, можно использовать следующий код:

product_id.categ_id

Параметры, используемые в поле Many2one:

  • comodel_name (str): Название целевой модели. Это обязательное поле, если оно не является связанным или расширенным.
  • Домен: Определяет условия для фильтрации выбираемых записей.
  • context (dict): Указывает контекст, который будет использоваться на стороне клиента при обработке поля.
  • ondelete (str): Определяет, что происходит при удалении связанной записи. Возможные значения: 'set null', 'restrict' и 'cascade '.
  • auto_join (bool): Указывает, следует ли автоматически генерировать SQL-запросы JOIN при поиске по полю (по умолчанию - False ).
  • delegate (bool): Если установлено значение True , поля целевой модели становятся доступными из текущей модели (соответствует _inherits ).
  • check_company (bool): Помечает поле для проверки в методе _check_company() и применяет домен компании по умолчанию на основе атрибута поля.

Поля One2many

Поле One2many представляет собой обратную связь по отношению Many2one. Оно связывает одну запись в текущей модели с несколькими записями в другой модели (совместной модели). Два ключевых параметра этого поля — это ' comodel_name ', указывающий на связанную модель, и ' inverse_name ', указывающий имя соответствующего поля Many2one в совместной модели.

По общепринятой практике, имена полей в сети One2many обычно заканчиваются suffix _ids.

field_ids = fields.One2many('comodel.name', 'inverse_name', 'Field Name')

Значение поля One2many представляет собой набор записей, содержащий все записи из связанной модели, где поле inverse_name соответствует текущей записи.

Например, рассмотрим следующее поле, определенное в модели res.partner .

sale_order_ids = fields.One2many('sale.order', 'partner_id', 'Sales Order')

В данном случае sale_order_ids — это поле типа One2many, связанное с моделью sale.order , которая содержит поле Many2one partner_id , указывающее на res.partner . В таблице res.partner вы не найдете столбца с именем sale_order_ids . Вместо этого связь хранится на стороне sale.order , где столбец partner_id содержит идентификатор связанного партнера.

Параметры, используемые для определения этого реляционного поля, следующие:

  • comodel_name (str): Указывает целевую модель для реляционного поля.
  • inverse_name (str): Указывает соответствующее поле Many2one, определенное в целевой модели.
  • Домен: Определяет условия для фильтрации выбираемых записей.
  • context (dict): Предоставляет дополнительный контекст, который будет использоваться на стороне клиента при обработке этого поля.

Атрибуты comodel_name и inverse_name являются обязательными, за исключением случаев, когда поле является связанным полем или расширением существующего поля.

Поля Man2many

Поле Many2many представляет собой двустороннюю связь, в которой несколько записей с одной стороны могут быть связаны с несколькими записями с другой. Ключевым параметром для этого типа поля является comodel_name , который указывает связанную модель. По общепринятой практике, имена полей Many2many обычно заканчиваются suffix _ids.

Поле типа Many2many можно определить в вашей модели, используя следующий синтаксис:

field_ids = fields.Many2many('comodel.name', string ='Field 
Name')

Поскольку поле содержит список записей, вы можете получить доступ к его данным, перебирая элементы, например:

for rec in self.field_ids: 

   print(rec.name)

Например, чтобы создать связь Many2many между нашей моделью и моделью res.users, мы можем определить поле с именем user_ids. 

Это поле позволит выбирать нескольких пользователей и отображать в интерфейсе метку « Пользователи». Определение выглядит следующим образом:

sale_order_ids = fields.One2many('sale.order', 'partner_id', 'Sales Order')

В этом случае несколько записей из модели могут быть связаны с несколькими записями comodel res.users . При определении такого поля доступны следующие параметры:

  • comodel_name – Указывает целевую модель, с которой создается связь.
  • relation (str) – Необязательное имя для промежуточной таблицы базы данных, в которой хранится связь.

Еще один пример — поле tag_ids , определенное в модели sale.order :

tag_ids = fields.Many2many( 

   'crm.tag', 

   'sale_order_tag_rel', 

   'order_id', 

   'tag_id', 

   string='Tags' 

)

При проверке таблицы sale.order в базе данных вы не найдете столбца с именем tag_ids . Это связано с тем, что поля типа Many2many не хранят свои значения непосредственно в таблице модели. Вместо этого Odoo создает отдельную реляционную таблицу для управления связью между двумя моделями.

В данном случае реляционные данные хранятся в таблице sale_order_tag_rel , которая содержит два столбца: order_id и tag_id . Эти столбцы содержат соответствующие идентификаторы записей из моделей sale.order и crm.tag соответственно.