Python SQLAlchemy选择混合属性表达式作为列

Python SQLAlchemy选择混合属性表达式作为列,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,我有一个SQLAlchemy hyrbid属性,类似于官方文档描述的 他们的示例代码如下所示: class SavingsAccount(基本): __tablename_u=“账户” id=列(整数,主键=True) user_id=Column(整数,ForeignKey(“user.id”),nullable=False) 余额=列(数字(15,5)) 类用户(基本): __tablename_=“用户” id=列(整数,主键=True) name=Column(字符串(100),null

我有一个SQLAlchemy hyrbid属性,类似于官方文档描述的

他们的示例代码如下所示:

class SavingsAccount(基本):
__tablename_u=“账户”
id=列(整数,主键=True)
user_id=Column(整数,ForeignKey(“user.id”),nullable=False)
余额=列(数字(15,5))
类用户(基本):
__tablename_=“用户”
id=列(整数,主键=True)
name=Column(字符串(100),null=False)
账户=关系(“储蓄账户”,backref=“所有者”)
@杂化性
def余额(自):
#我不想用这种方法
返回金额(自身账户中acc的acc余额)
@平衡表达
def余额(cls):
#这就是我想计算总余额的方法
返回(
选择([func.sum(SavingsAccount.balance)])
.where(SavingsAccount.user_id==cls.id)
.标签(“总余额”)
)
如果我选择的是多个用户的列表,我希望基于
balance.expression
填充
User.balance
的值,这样聚合是在SQL中完成的,而不是在Python中。然而,我找不到一个方法来做到这一点

我能想到的最接近的方法是:

>User.query.add_列(User.balance.all)()
[(,十进制('10.00'),(,十进制('15.00'),(,十进制('10.00'))]

是否有另一种方法来进行聚合查询,以填充模型上的属性(不是仅仅返回一个元组?我查看了
column\u属性
,但它的示例较少,而且似乎对我的所有用例都不够强大。

多亏了。基本上,我需要使用
column\u属性
,但由于所有逻辑,我需要以一种简陋的方式设置
column\u属性
。非常理想首先,我可以使用
@declared_attr
属性,但SQLAlchemy目前似乎不支持这一点

因此,我们需要使用带有事件侦听器的函数来定义并将其附加到
User

class SavingsAccount(ext.db.Model):
__tablename=“测试账户”
id=ext.db.Column(ext.db.Integer,主键=True)
user\u id=ext.db.Column(ext.db.Integer,ext.db.ForeignKey(“test\u user.id”),nullable=False)
余额=ext.db.列(ext.db.数字(15,5))
类用户(ext.db.Model):
__tablename=“测试用户”
id=ext.db.Column(ext.db.Integer,主键=True)
name=ext.db.Column(ext.db.String(100),null=False)
账户=外部数据库关系(“SavingsAccount”,backref=“owner”)
@事件。侦听(映射器,“映射器已配置”)
def设置线程计数(映射器、cls)->无:
如果不是issubclass(cls,用户):
返回
总余额子查询=(
选择([func.sum(SavingsAccount.balance)])
.where(SavingsAccount.user_id==cls.id)
.标签(“总余额”)
)
cls.total\u balance=列属性(total\u balance\u子查询,deferred=True)
难看,但它能工作。如果能听到一个更干净的替代解决方案,我还是会非常高兴的