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