2016-03-30 4 views
1

У меня проблемы с пониманием наследования в odoo. Рассмотрим следующий код в модуль 1Odoo 8 method resolution order

`class pos_order(models.Model): 
    _inherit = 'pos.order' 
    def create_from_ui(self, cr, uid, orders, context=None): 
     super(models.Model, self).create_from_ui(cr, uid, orders, context=context) 
     print "1"` 

и тот же модуль 2, только он печатает 2. Первый модуль 1 установлен, то модуль 2. Как вы видите, в обоих pos_order расширена с пользовательской функцией create_from_ui. Если вызывается create_from_ui, теперь вызывается порядок module2, который в свою очередь вызывает порядок module1, который в свою очередь вызывает оригинал. Как я могу теперь назвать только оригинал (скажем, я не хочу, чтобы «1» печатался при определенных обстоятельствах)?

Приветствие и большое спасибо за помощь

ответ

2

Odoo устанавливает иерархию, но обычные правила Python применяются.

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

from openerp.addons.point_of_sale.point_of_sale import pos_order as original_pos_order 

class pos_order(models.Model): 
    _inherit = 'pos.order' 
    def create_from_ui(self, cr, uid, orders, context=None): 
    original_pos_order.create_from_ui(self, cr, uid, orders, context=context) 
    print "1"` 
+0

Андреас это, должно быть, я даже не думал об этом! :) Спасибо – detroit

+0

Другой вопрос по этой проблеме. Я пытаюсь вызвать функцию «create», которая вызывается в конце исходного create. Я знаю, что это звучит странно, но pos_order.create вызывает другое создание, которое приводит к некоторой оболочке old_api и возвращает новый идентификатор заказа 'return super (pos_order, self) .create (cr, uid, values, context = context)'. Как я могу назвать это создание из недавно созданного модуля. Мне просто нужно позвонить прямо. Если я назову именно эту часть кода в новом модуле, вызывается исходное pos_order.create, так как оно имеет такое же имя. Еще раз спасибо – detroit

+0

@detroit Да, это 'create()', который фактически записывается в базу данных. Это часть класса Model (тот, который вы унаследовали), поэтому вы можете просто называть 'models.Model.create (self, ...)' –