插件

declared_attr

声明属性,类似于 property 用来定义实例的动态属性, declared_attr 用来定义类的动态属性

主要用在动态生成 Field, 或动态生成 Model.__table_name__:

from olo.ext.declared import declared_attr


class BaseModel(object):

    @declared_attr
    def id(cls):
        if cls.__name__ == 'Foo':
            return Field(str)
        return Field(int)

    @declared_attr
    def __table_name__(cls):
        return cls.__name__.lower()

hybrid_property

混合属性,某些情况先需要一些特殊的属性来作为查询条件:

from olo.ext.hybrid import hybrid_property


class Line(BaseModel):
    start = Field(int)
    end = Field(int)

    @hybrid_property
    def length(self):
        return self.end - self.start


line = Line.query.filter(Line.length == 2).first()
assert line.length == 2

可爱的是 hybrid_property 可以作为 index_key 的一部分, 从而可以作为被缓存对象的请求条件,详情请看 CacheWrapper

from olo.ext.hybrid import hybrid_property


class Line(BaseModel):
    start = Field(int)
    end = Field(int)

    __index_keys__ = (
        ('length',),
    )

    @hybrid_property
    def length(self):
        return self.end - self.start


# 命中缓存
Line.cache.get_by(length=2)

exported_property

某些情况下需要通过 Model.to_dict 方法来导出其他的属性:

from olo.ext.exported import exported_property


class Line(BaseModel):
    start = Field(int)
    end = Field(int)

    @exported_property
    def length(self):
        return self.end - self.start

line = Line.create(start=1, end=3)
assert line.to_dict() == {'start': 1, 'end': 3, 'length': 2}