Python中Flask SQLAlchemy的Model如何优雅地进行简单查询和计算
通过关系查找 ForeignKey 的字段值,简单计算本身的字段值,比如下面的查找到 Part 的重量,根据单位价格计算总价,把这个写在 Model 中合适吗?看文档中好像没有相关的例子,这种情况应该很常见吧
class Part(db.Model):
...
id = db.Column(db.Integer, primary_key=True)
weight = db.Column(db.Float, nullable=False)
...
class Quote(db.Model):
...
unit_price = db.Column(db.Float, nullable=False)
part_id = db.Column(db.Integer, db.ForeignKey("part.id"))
part = db.relationship("Part", backref=db.backref('quotes', lazy=False))
price = db.Colum(db.Float)
...
def cal_price(self):
p = Part.query.filter_by(Part.id=self.part_id).first()
self.price = p.weight*self.unit_price
Python中Flask SQLAlchemy的Model如何优雅地进行简单查询和计算
2 回复
在Flask-SQLAlchemy里做简单查询和计算,直接用query和SQLAlchemy的func函数就行。下面是个例子,假设我们有个User模型,要查用户数和平均年龄:
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import func
db = SQLAlchemy()
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
age = db.Column(db.Integer)
# 查询所有用户
users = User.query.all()
# 计算用户总数
user_count = User.query.count()
# 计算平均年龄
avg_age = db.session.query(func.avg(User.age)).scalar()
# 带条件的查询,比如年龄大于25的用户
users_over_25 = User.query.filter(User.age > 25).all()
# 分组统计,比如按年龄分组统计人数
age_counts = db.session.query(User.age, func.count(User.id)).group_by(User.age).all()
关键点就两个:用Model.query做基础查询,用func做聚合计算。scalar()方法用来获取单个值,all()返回列表。复杂点的查询就用filter加条件。
总结:用query和func组合就能搞定大部分简单查询。
好像没什么毛病
不过建了外键了,为啥不直接 p = self.part

