Наследование в openERP (odoo)

Я новичок в openERP и у меня собеседование. Пожалуйста, объясните идею различных типов наследования в openERP, я думаю, что всего 3 типа. пожалуйста, объясните это очень просто с точки зрения интервью.
P.S: я знаком с концепцией простого наследования.


person Mudasir Sharif    schedule 08.06.2015    source источник


Ответы (1)


Наследование:

Механизм наследования используется для создания идеи повторного использования. Повторное использование означает повторное использование кода родительского класса в любом объектно-ориентированном программировании.

Преимущества:

  1. Уменьшите избыточность кода.
  2. Обеспечивает повторное использование кода.
  3. Уменьшает размер исходного кода и улучшает его читаемость.
  4. Код прост в управлении и разделен на родительские и дочерние классы.
  5. Поддерживает расширяемость кода, переопределяя функциональность базового класса в дочерних классах.

Недостатки:

  1. В Inheritance базовый класс и дочерние классы тесно связаны. Следовательно, если вы измените код родительского класса, он повлияет на все дочерние классы.

  2. В иерархии классов многие элементы данных остаются неиспользованными, а выделенная им память не используется. Следовательно, повлияйте на производительность вашей программы, если вы неправильно реализовали наследование.

В OpenERP есть два способа наследования.

1. Классический вариант с использованием Pythonic:

Это позволяет добавить к модели определенное «общее» поведение, наследуя классы, производные от orm.Model, такие как geoModel, которые добавляют поддержку географики.

 class Myclass(GeoModel, AUtilsClass):

Использование _inherit :-

Основная цель — добавить новые модели поведения/расширить существующие модели. Например, вы хотите добавить новое поле в счет-фактуру и добавить новый метод

class AccountInvoice(orm.Model):
    _inherit = "account.invoice"
    _column = {'my_field': fields.char('My new field')}
    def a_new_func(self, cr, uid, ids, x, y, context=None):
        # my stuff
        return something

переопределить существующий метод:

def existing(self, cr, uid, ids, x, y, z, context=None):
    parent_res = super(AccountInvoice, self).existing(cr, uid, ids, x, y, z, context=context)
    # my stuff
    return parent_res_plus_my_stuff

2. Полиморфный способ:-

Использование _inherits :-

При использовании _inherits вы будете делать своего рода полиморфную модель в виде базы данных.

Например, product.product наследует product.template или res.users наследует res.partner. Это означает, что мы создаем модель, которая получает ноу-хау модели, но добавляет дополнительные данные/столбцы в новую таблицу базы данных. Таким образом, когда вы создаете пользователя, все данные о партнере сохраняются в таблице res_partner (и партнер создается), а вся информация, связанная с пользователем, сохраняется в таблице res_users.

Для этого мы используем dict: _inherits = {'res.partner': 'partner_id'} Ключ соответствует базовой модели, а значение внешнего ключа — базовой модели.

То же самое с помощью XML вы можете наследовать представления Odoo (такие как представление формы, представление дерева, представление поиска и т. д.), а также изменять поведение представления

Ключевой момент:

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

Я надеюсь, что это должно быть полезно для вас ..:)

person DASADIYA CHAITANYA    schedule 09.06.2015
comment
Вы пропустили третий, упомянутый в документах odoo. это не настоящее наследование, а копия атрибутов модели путем объединения _inherit и _name. Может быть, вам тоже стоит упомянуть об этом? :-) - person CZoellner; 08.05.2016
comment
Можем ли мы использовать _inherits и _inherit одновременно? @DASADIYACHAITANYA - person Dheeraj Balodia; 07.09.2017
comment
Оба варианта не отличаются в зависимости от нашего использования: мы выбираем _inherit или _inherits. - person DASADIYA CHAITANYA; 07.09.2017