2015-10-29 2 views
3

Я предполагаю, что он используется для обозначения полей в других модулях в openerp, но я не уверен.Что такое self.pool.get() в python и odoo?

Здесь они как-то получают цену от одного модуля продукта до модуля продаж.

price = self.pool.get('product.pricelist').price_get(cr, uid, [pricelist], product, qty or 1.0, partner_id, ctx)[pricelist] 
    if price is False: 
     warn_msg = _("Cannot find a pricelist line matching this product and quantity.\n" 
       "You have to change either the product, the quantity or the pricelist.") 

     warning_msgs += _("No valid pricelist line found ! :") + warn_msg +"\n\n" 
    else: 
     result.update({'price_unit': price}) 
     if context.get('uom_qty_change', False): 
      return {'value': {'price_unit': price}, 'domain': {}, 'warning': False} 

ответ

5

self.pool.get()

pool здесь просто словарь-подобный объект, который используется для хранения экземпляров в OpenERP models, как res.users или ir.model.data.

Многопользовательский характер OpenERP/Odoo: Один серверный процесс OpenERP может управлять несколькими базами данных, а для каждой базы данных набор установленных модулей и, следовательно, набор моделей могут различаться.

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

Благодаря The Hypered Blog для большого объяснения на self.pool.get(). Для получения дополнительной информации проверьте эту ссылку.

1

self.pool.get() используется для получения экземпляра Singleton модели ORM из пула реестра.

Если вы хотите, чтобы вызвать методы ORM для любой другой модели вы можете использовать self.pool.get('model').orm_method

И в новом API, если вы хотите, чтобы вызвать метод ORM непосредственно от объекта, вы можете использовать self.env['obj'].method вместо self.method

Надеюсь это поможет.

4

бассейн

бассейн реестр (объект словаря {}).

Реестр по существу является сопоставлением между именами моделей и образцами . В базе данных имеется один экземпляр реестра.

сервер/OpenERP/ОСВ/orm.py

class BaseModel(object): 

    def __init__(self, pool, cr): 
""" Initialize a model and make it part of the given registry. 

     - copy the stored fields' functions in the osv_pool, 
     - update the _columns with the fields found in ir_model_fields, 
     - ensure there is a many2one for each _inherits'd parent, 
     - update the children's _columns, 
     - give a chance to each field to initialize itself. 

     """ 
 pool.add(self._name, self) 
     self.pool = pool 

См /openerp/sql_db.py, чтобы увидеть, как Odoo -Постановка связи бассейн установить.

_Pool = None 

def db_connect(to, allow_uri=False): 
    global _Pool 
    if _Pool is None: 
     _Pool = ConnectionPool(int(tools.config['db_maxconn'])) 

    db, uri = dsn(to) 
    if not allow_uri and db != to: 
     raise ValueError('URI connections not allowed') 
    return Connection(_Pool, db, uri) 

def close_db(db_name): 
    """ You might want to call openerp.modules.registry.RegistryManager.delete(db_name) along this function.""" 
    global _Pool 
    if _Pool: 
     _Pool.close_all(dsn(db_name)[1]) 

def close_all(): 
    global _Pool 
    if _Pool: 
     _Pool.close_all() 

класс Connection

class Connection(object): 
    """ A lightweight instance of a connection to postgres 
    """ 
    def __init__(self, pool, dbname, dsn): 
     self.dbname = dbname 
     self.dsn = dsn 
     self.__pool = pool 

, если вы посмотрите на файл /server/openerp/pooler.py там вы можете найти метод get_db_and_pool, который используется для создания и вернуть соединение с базой данных и новый инициализированный реестр, существует много других методов, связанных с пулом.

def get_db_and_pool(db_name, force_demo=False, status=None, update_module=False): 
    """Create and return a database connection and a newly initialized registry.""" 
    registry = RegistryManager.get(db_name, force_demo, status, update_module) 
    return registry.db, registry 


def restart_pool(db_name, force_demo=False, status=None, update_module=False): 
    """Delete an existing registry and return a database connection and a newly initialized registry.""" 
    registry = RegistryManager.new(db_name, force_demo, status, update_module) 
    return registry.db, registry 

def get_db(db_name): 
    """Return a database connection. The corresponding registry is initialized.""" 
    return get_db_and_pool(db_name)[0] 


def get_pool(db_name, force_demo=False, status=None, update_module=False): 
    """Return a model registry.""" 
    return get_db_and_pool(db_name, force_demo, status, update_module)[1] 

И, наконец, вы вызываете получить метод словаря, чтобы получить значение указанного ключа, даже вы можете использовать можно использовать self.pool [ «MODEL_NAME»], любой метод словаря может быть использован с бассейном ,

 Смежные вопросы

  • Нет связанных вопросов^_^