Odoo运行机制(五)--ORM

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的模型有三种:ModelTransientModelAbstractModel.Api.Meta.new()对类的方法进行了包装,以满足新旧接口的需求。


                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值