我认为它用于引用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}
答案 0 :(得分:5)
<强> self.pool.get() 强>
pool
这里只是一个类似字典的对象,用于存储OpenERP models
的实例,如res.users
或ir.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
希望这有帮助。