在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的属性中生成混合属性和表达式。例如,我想自动为城市,州,街道等定义混合属性和表达式。
更新 我原本想做的事情还不够清楚。请参阅上文,了解我为何要自动生成混合属性和表达式的更新。
答案 0 :(得分:0)
如果current_address
属性不是person
的属性,您可以覆盖特殊方法__getattr__
以获取属性。
class Person(db.Model):
# ...
def __getattr__(self, item):
return getattr(self.current_address, item)