Api.Meta
Odoo采用了自已的ORM模型,8.0与7.0相比,在接口上有了较大区别。8.0支持了基于记录的操作接口,但为了对下兼容7.0,在实现的时候,提供了两套不同的接口。
Odoo的ORM,主要基于meta类的神奇之处。
api.Meta.__new__()-->api.decorate()#设置_orig
|-->api.guess()-->api.cr_uid_id_context()-->api.make_wrapper()
class Meta(type):
...
def __new__(meta, name, bases, attrs):
# dummy parent class to catch overridden methods decorated with 'returns'
parent = type.__new__(meta, name, bases, {})
for key, value in attrs.items():
if not key.startswith('__') and callable(value):#仅处理不以__开头的方法
# make the method inherit from decorators
value = propagate(getattr(parent, key, None), value)#对从父类继承,而没有重载的函数进行修饰
# guess calling convention if none is given
if not hasattr(value, '_api'):#没有被修饰过的方法。方法在guess中将设置_api属性
try:
value = guess(value)
except TypeError:
pass
attrs[key] = value
return type.__new__(meta, name, bases, attrs)
class MetaModel(api.Meta):
...
class BaseModel(object):
...
__metaclass__ = MetaModel
class Model(BaseModel):
...
class TransientModel(BaseModel):
...
class AbstractModel(BaseModel):
...
从代码中可以看出,Odoo的模型有三种:Model,TransientModel和AbstractModel.Api.Meta.new()对类的方法进行了包装,以满足新旧接口的需求。