Введение
В Odoo вся информация о бизнес-процессах хранится в моделях — это схемы, которые определяют структуру данных в базе. Заказы, счета, контакты и всё остальное — у каждого есть своя модель, и именно по ним система понимает, как работать с записями.
Для разработчиков и функциональных консультантов понимание моделей — одна из базовых компетенций. На уровне моделей задаются поля, связи и бизнес-логика, а значит от архитектуры моделей напрямую зависит работоспособность и масштабируемость внедрения.
Где хранится информация о самих моделях? Для этого в Odoo существует ir.model — реестр, который содержит метаданные обо всех моделях системы. Любая работа с API, отладка или создание кастомных решений неизбежно приводит к обращению к этому реестру.
Что такое модель ir.model
ir.model — это база метаданных: одна запись в ней соответствует одной модели в Odoo. При создании новой модели в коде или через визуальные инструменты Odoo автоматически создаёт или обновляет запись в этом реестре.
Модель ir.model входит в базовый модуль и является частью ядра системы. Для каждого вида модели — обычной, абстрактной или временной (transient) — в реестре присутствует соответствующая запись, что обеспечивает единый механизм управления метаданными.
ir.model тесно связана с ir.model.fields — таблицей, где хранятся метаданные по каждому полю моделей. Вместе они дают возможность «заглянуть внутрь» структуры данных и реализовать механизмы рефлексии и интуитивного анализа схемы.
Разработчики обращаются к ir.model, когда нужно получить список доступных моделей, проверить цепочки наследования или реализовать универсальные инструменты, работающие с любыми моделями. Метаданные доступны через API — XML-RPC и JSON-RPC — для интеграций и автоматизации.
Ключевые поля модели
Ниже перечислены ключевые поля ir.model — знание их назначения упрощает навигацию по реестру и работу с системной архитектурой.
1. name
Тип: Char. Читабельное название модели, которое показывается в Технических настройках и инструментах разработчика. Поле переводимо и служит меткой при просмотре списка моделей.
2. model
Тип: Char. Техническое имя модели — строка, используемая в Python-коде (например, res.partner или sale.order). Поле обязательно и индексировано для быстрых выборок.
3. info
Тип: Text. Поле для пояснений и заметок о модели — документация или внутренние комментарии. Зачастую остаётся пустым, но полезно для нестандартных реализаций.
4. state
Тип: Selection. Показывает источник модели: базовая (из модулей Odoo) или созданная вручную (через Studio или кастомный код). Базовые модели защищены, ручные — гибче модифицируются.
5. transient
Тип: Boolean. Флаг временной модели. Когда True, данные считаются временными и периодически очищаются — используется для мастер-форм, мастеров и прочих временных задач.
6. field_id
Тип: One2many (ir.model.fields). Список полей модели. Каждая запись в ir.model.fields описывает конкретное поле: имя, тип и дополнительные параметры.
7. access_ids
Тип: One2many (ir.model.access). Правила доступа, привязанные к модели. Здесь указывают, какие группы имеют права на создание, чтение, изменение и удаление записей.
8. rule_ids
Тип: One2many (ir.rule). Правила записи (record rules) для управления доступом на уровне строк — кто и какие записи видит или может изменять.
9. inherited_model_ids
Тип: Many2many (ir.model). Ссылки на родительские модели при наследовании. При расширении модели дочерняя запись указывает на родителей здесь, что отражает иерархию наследования.
10. modules
Тип: Char. Вычисляемое поле со списком модулей, которые определяют или расширяют модель. Полезно при анализе зависимостей и источников изменений.
11. sort
Тип: Integer. Позиция в списке Технических настроек — модели с меньшим значением отображаются выше. Удобно для организации длинных списков.
12. constrains
Тип: Text. Описание Python-ограничений (@api.constrains) — код, который выполняется для валидации данных на уровне модели.
13. post_constrains
Тип: Text. Пост-валидации, выполняемые после основных ограничений. Нужны в сложных сценариях проверки данных.
14. sql_constraints
Тип: Text. SQL-ограничения — например, уникальные индексы, обеспечивающие целостность данных на уровне БД.
15. view_ids
Тип: One2many (ir.ui.view). Вычисляемое поле, показывающее связанные представления (views) для данной модели — удобно при аудите интерфейсов и отладке отображения.
16. record_count
Тип: Integer. Вычисляемое значение — количество записей модели. Полезно для оценки объёма данных и при построении отчётов.
17. display_name
Тип: Char. Вычисляемое отображаемое имя записи, которое видит пользователь в списках и связях — обычно комбинация имени и технического идентификатора.
18. create_date
Тип: Datetime. Время создания записи в реестре — управляется автоматически Odoo.
19. create_uid
Тип: Many2one (res.users). Пользователь, создавший запись — пригодится для аудита и расследования изменений.
20. write_date
Тип: Datetime. Время последнего изменения записи — автоматически обновляется при редактировании.
21. write_uid
Тип: Many2one (res.users). Пользователь, последним изменивший запись — также служит для аудита.
22. active
Тип: Boolean. Флаг «активности» записи — при False запись считается архивированной и не участвует в обычных сценариях, используется для устаревших моделей.
23. id
Тип: Integer. Уникальный идентификатор в базе данных — применяется при обращениях через API и внутренних ссылках.
24. restrict_functionality
Тип: Boolean. Флаг, указывающий на ограниченную функциональность модели в разных выпусках Odoo (Enterprise vs Community).
25. is_mail_thread
Тип: Boolean. Отмечает, поддерживает ли модель «почтовую ленту» — сообщения, подписчиков и чатовую активность.
26. is_mail_activity
Тип: Boolean. Показывает, поддерживает ли модель планирование активностей (tasks/activities) и отслеживание следующего шага.
Как эта модель применяется в бизнес-процессах
1. Технические настройки и конфигурация
Администраторы просматривают модели через меню Технических настроек — именно записи ir.model формируют этот список. Для каждой модели видно название, описание и количество полей, что упрощает аудит системы.
2. Управление правами доступа
При настройке безопасности администраторы назначают права группам — таблица access_ids в ir.model определяет, какие группы могут создавать, читать, изменять или удалять записи конкретной модели.
3. Кастомизация через Odoo Studio
При создании пользовательских моделей в Studio система добавляет записи в ir.model с состоянием manual, а также заполняет связанные записи в ir.model.fields для новых полей — всё это без ручного программирования.
4. Открытие API и интеграции
Внешние системы получают информацию о доступных моделях через API (XML-RPC/JSON-RPC). Запросы к ir.model позволяют динамически обнаруживать структуру и строить универсальные интеграторы.
5. Разработка модулей и отладка
Разработчики анализируют ir.model, чтобы понять, откуда пришло наследование (inherited_model_ids) и какие поля есть у модели (field_id) — это помогает избегать конфликтов при расширении функционала.
Как разработчики расширяют эту модель
Разработчикам редко требуется менять саму ir.model вручную. Реестр обновляется автоматически при загрузке модулей, поэтому обычно достаточно определять новые модели и поля стандартными механизмами.
Наследование моделей
Когда вы в Python объявляете _inherit = 'res.partner', Odoo обновляет запись в ir.model для res.partner, а у наследующей модели появляется связь на родителя в inherited_model_ids — так система отражает дерево наследования и поддерживает единообразие метаданных.
Добавление полей
При добавлении полей в модель система создаёт записи в ir.model.fields, которые ссылаются на ir.model через поле model_id. Сам реестр модели обычно не меняется — информация о полях хранится отдельно.
Расширения в Python
Как правило, ir.model не переопределяют: это инфраструктурная модель ядра. Если требуется изменить поведение, расширяют целевые модели и их методы, которые уже описаны в реестре, а не сам реестр.
Odoo Studio
Studio автоматически создаёт записи ir.model и ir.model.fields при проектировании новых объектов в интерфейсе. Транзиентные модели помечаются флагом transient; абстрактные классы (без таблиц) в реестре не создаются.
Рекомендации по использованию
- Практический совет: используйте ir.model для динамической инспекции и обнаружения моделей при интеграциях вместо хардкода. Это делает интеграции надёжнее и гибче.
- Ищите по полю model, когда нужно получить метаданные конкретной модели — это индексированное поле, подходящее для быстрых запросов.
- Перед расширением изучите inherited_model_ids, чтобы понять цепочку наследования и не столкнуться с неожиданными конфликтами полей или методов.
- Чтение ir.model через API (XML-RPC/JSON-RPC) — стандартный способ для интеграторов. Избегайте прямых правок в реестре, если вы не разрабатываете инструменты наподобие Studio.
- Для анализа полей используйте ir.model.fields: relation field_id даёт полный список полей модели и их свойств.
Распространённые ошибки
- Неправильная идея — массово изменять записи ir.model вручную: реестр управляется системой, и ручные правки могут сломать бизнес-логику или быть перезаписаны при обновлении.
- Не путайте запись ir.model с самой Python-классом модели: первая хранит метаданные в базе, вторая реализует поведение и методы — это родственные, но разные сущности.
- Не стоит считать, что каждая модель имеет запись в ir.model: абстрактные модели, не создающие таблиц, в реестре не появляются.
- Не забывайте про временные (transient) модели: данные в них очищаются автоматически — никогда не используйте transient для хранения важных постоянных данных.
- При запросе реестра фильтруйте результаты: в типичной инсталляции Odoo сотни моделей, поэтому запросы без ограничений будут громоздкими и малоинформативными.
Выводы
ir.model — это регистр моделей Odoo: он аккумулирует метаданные о каждой сущности в системе. Понимание его структуры и связей с ir.model.fields даёт практическое преимущество при анализе архитектуры данных.
Независимо от роли — консультант по процессам или интегратор — знание ir.model экономит время и снижает риск ошибок при настройке, расширении или интеграции системы.
Нужна помощь с внедрением Odoo?
Dasolo помогает компаниям внедрять, настраивать и оптимизировать Odoo. Мы специализируемся на интеграциях через API и разработке модулей, имея глубокие знания о внутренней архитектуре Odoo и моделях вроде ir.model.
Если вам нужна помощь с внедрением Odoo, разработкой модулей или интеграциями — мы готовы подключиться и помочь. Запланируйте демонстрацию чтобы обсудить ваш проект.