根据烧瓶SQLAlchemy中的func.sum()值将结果传递给模板

时间:2018-10-11 20:31:13

标签: python flask sqlalchemy

我正在route.py文件中进行一些计算。使用下面的代码,我可以将计算结果传递到模板中。

**(my routes.py)**
@app.route('/sum')
def sum():
    tups = db.session.query(Mat2.elev.label("elevnavn"), db.func.sum(Mat2.a 
    + Mat2.b + Mat2.c + Mat2.d + Mat2.e).label("csum")).group_by(Mat2.id).all()
return render_template('sum.html', tups=tups)


**(my template)**
<html>
<head>
    <title>Sum</title>
</head>
<body>
    {% for i in tups %}
    <p>{{ i.csum }}</p><br>
    {% endfor %}
</body>

我一直在尝试根据计算值将不同的字符串传递给模板。像...

如果csum值介于0到100之间,则显示“内容”

如果csum的值在101到150之间,则显示“其他”。

我似乎找不到解决我问题的方法。有什么技巧可以解决吗?

1 个答案:

答案 0 :(得分:0)

Sqlalchemy ORM包含功能强大的表达式API,可用于问题中所述的类型
的查询。

对于您的用例,结果查询将为:

  

选择 field1,field2,...
  案例
      当(sum( field1 )> =:param_1 AND sum( field1 )<=:param_2)然后:param_3
      当(sum( field1 )> =:param_4 AND sum( field1 )<=:param_5)然后:param_6
  END AS 别名
  从
  GROUP BY field2

可以使用sqlalchemy.sql.expression.case生成CASE表达式来类似地编写。

from sqlalchemy.sql.expression import case, and_

elevnavn = Mat2.elev.label("elevnavn")
csum = db.func.sum(Mat2.a + Mat2.b + Mat2.c + Mat2.d + Mat2.e)

from_0_to_100 = and_(csum >= 0, csum <= 100)
from_101_to_150 = and_(csum >= 101, csum <= 150)

csum_cases = case([
    (from_0_to_100, "something"),
    (from_101_to_150, "something else")
]).label("csum")

tups = db.session.query(elevnavn, csum_cases).group_by(Mat2.id).all()