python和odoo中的self.pool.get()是什么?

时间:2015-10-29 07:40:55

标签: openerp openerp-7

我认为它用于引用openerp中其他模块中的字段,但我不确定。

在这里他们以某种方式从一个产品模块到销售模块获得价格。

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}

3 个答案:

答案 0 :(得分:5)

  

<强> self.pool.get()

pool这里只是一个类似字典的对象,用于存储OpenERP models的实例,如res.usersir.model.data

OpenERP / Odoo的多数据库特性:单个OpenERP服务器进程可以管理多个数据库,对于每个数据库,已安装模块的集合以及模型集可以有所不同。

因此,我们有不同的pools,每个数据库一个,以及引用我们已经在的模型实例的常规方法, self

感谢The Hypered Blog self.pool.get() 的详细解释。 有关详细信息,请查看该链接。

答案 1 :(得分:4)

<强>池

  

pool是一个注册表(字典对象{})。

     

注册表实际上是模型名称和模型之间的映射   实例。每个数据库都有一个注册表实例。

服务器/ OpenERP的/ OSV / 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-Postgresql如何连接   游泳池建立。

_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()

连接类

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]

最后你调用get方法获取指定键的值,即使你可以使用 self.pool [&#39; model_name&#39;] ,任何方法字典可以与池一起使用。

答案 2 :(得分:1)

self.pool.get()用于从注册池中获取orm模型的Singleton实例。

如果您想为任何其他模型调用orm方法,可以使用self.pool.get('model').orm_method

在新API中,如果您想直接从对象调用ORM方法,可以使用self.env['obj'].method代替self.method

希望这有帮助。