从SQLAlchemy Mixins自动创建混合属性

时间:2014-10-14 21:26:50

标签: python sqlalchemy

在SQLAlchemy中,我希望有一个自动创建混合属性的类来公开特定子表中的属性。考虑这个结构:

class Address(Model):
    id = Column(Integer, primary_key=True)
    street = Column(String)
    number = Column(Integer)
    valid_from = Column(DateTime)
    valid_to = Column(DateTime)
    person_id = Column(Integer, ForeignKey('person.id'))
    person = relationship('Person', backref=backref('addresses', lazy='dynamic')

class Person(db.Model, HybridPropertyGeneratorMixin):

    data_class = Address

    id = Column(Integer, primary_key=True)

    @property
    def current_address(self):
        return self.addresses.order_by(desc(Address.valid_from))[0]

    @hybrid_property
    def city(cls):
        return self.current_address.city

    @city.expression
    def city(cls):
        return select([Address.name]). \
        where(cls.id==Address.person_id). \
        where(Address.valid_to == None).as_scalar()

我尝试做的是定义一个mixin,它会自动查看data_class的属性,并从data_class的属性中生成混合属性和表达式。例如,我想自动为城市,州,街道等定义混合属性和表达式。

更新 我原本想做的事情还不够清楚。请参阅上文,了解我为何要自动生成混合属性和表达式的更新。

1 个答案:

答案 0 :(得分:0)

如果current_address属性不是person的属性,您可以覆盖特殊方法__getattr__以获取属性。

class Person(db.Model):
    # ...

    def __getattr__(self, item):
        return getattr(self.current_address, item)