Представление модели в Odoo - m3dbedb/odoo GitHub Wiki
Модель определяется в классе Питона. Модули дополняются так же с помощью классов, но используя особенный механизм наследования Odoo.
Для расширения существующей модели используется класси Питона с параметром _inherit
. Это говорит о том, какая модель будет улучшена. Новый класс наследует все возможности родительской модели Odoo остаётся только описать желаемые изменения.
Фактически модели Odoo существуют вне отдельного модуля Питона, в общем реестре. Этот реестр может быть доступен из методов модели используя self.env[<имя модели>]
. К примеру, чтобы получить ссылку на объект, представляющий модель res.partner
, напишем self.env['res.partner']
.
Чтобы изменить модель Odoo возьмём ссылку на её класс в реестре Оды и произведём местные изменения класса. Это значит, что изменения так же будут доступны везде, где будет использоваться эта новая модель.
Во время запуска сервера Odoo, последовательность загрузки модулей относительна - изменения произведённые отдельным модулем видимы только модулям, загружаемым после него. Важно правильно установить зависимости и убедиться что используемые модули указаны в числе зависимостей.
Добавление в существующую модель tdo.task
полей date_deadline
(срок решения задачи) и user_id
(ответственный) с помощью наследования.
# -*- coding: utf-8 -*-
from odoo import models, fields, api # делаем доступными новому классу объектов типа `модели` и `поля`
class TTask(models.Model): # название нового класса и тип модуля. Название класса малозначительно
_inherit = 'tdo.task' # указываем атрибут _name наследуемой модели, именно по этому полю в Оде
# происходит обращение к другим модулям
user_id = fields.Many2one('res.users', 'Ответственный')
date_deadline = fields.Date('Срок исполнения')
# атрибут _name у нового класса не указываем, он берётся у наследуемой модели