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

回到顶部