试图在 Jinja2 模板中查找列表的总和

Trying to find sum of a list in a Jinja2 template

我有一个 flask 应用程序,我需要在其中显示投资者的总投资。有3个模型,即Fund、Investor和Investments,它们的定义为:

class Fund(db.Model):
    FundID = db.Column(db.Integer, primary_key=True)
    FundName = db.Column(db.String(50), unique=True, nullable=False)
    UnitPrice = db.Column(db.Float)

    def __repr__(self):
        return f"Fund('{self.FundName}', '{self.UnitPrice}')"

class Investor(db.Model):
    InvestorID = db.Column(db.Integer, primary_key=True)
    FirstName = db.Column(db.String(20), nullable=False)
    LastName = db.Column(db.String(20), nullable=False)
    email = db.Column(db.String(100), unique=True, nullable=False)
    fund_value = db.relationship('Investment', backref='Investor')
    
    def __repr__(self):
        return f"Investor('{self.InvestorID}','{self.FirstName}')"


class Investment(db.Model):
    InvestmentID = db.Column(db.Integer, primary_key=True)
    Fund_ID = db.Column(db.Integer, db.ForeignKey('fund.FundID'), nullable=False)
    Investor_ID = db.Column(db.Integer, db.ForeignKey('investor.InvestorID'), nullable=False)
    Units = db.Column(db.Integer, nullable=False)
    Investment_Value = db.Column(db.Integer)
    
    def __repr__(self):
        return f'{self.Investment_Value}'

我的投资者页面路径如下:

@app.route("/Investors", methods=['GET','POST'])
def Investors():
    Investors = Investor.query.all()
    return render_template('Investors.html', title="List of Investors", investors=Investors) 

最后,我的模板Investors.html如下:

{% extends "layout.html" %}
{% block content %}
        <h1>List of Investors</h1><br/>
        <table>
        <tr>
                <th>Name</th>
                <th>Email</th>
                <th>Total Investment Value</th>
        </tr>
        {% for investor in investors %}        
                <tr>
                  <td><a class="mr-2" href="{{ url_for('update_investor', Investor_ID=investor.InvestorID) }}">{{ investor.FirstName }} {{ investor.LastName }}</a></td>
                  <td>{{ investor.email }}</td>
                  <td>{{ investor.fund_value|sum }}</td>
                </tr>
        {% endfor %}
        </table><br/>
        <div>
          <a class="btn btn-info" href="{{ url_for('create_investor') }}">Add New Investor</a>
        </div>        
{% endblock %}

现在,在这个模板中,在最后一个 td 中,我试图找到特定投资者的所有投资的总和并显示它,但是当我使用 {{ investor.fund_value|sum }}它给了我错误“TypeError:+ 不支持的操作数类型:'int' 和 'Investment'”。我在我的 Jinja 模板中通过 运行 循环尝试了这个,但没有帮助。由于我是 Flask 的新手,所以我在这里被困了一段时间,所以感谢任何帮助。

你应该把那种逻辑带到视图上,或者做一个class方法。

更新视图的方法如下:

@app.route("/Investors", methods=['GET','POST'])
def Investors():
    Investors = Investor.query.all()

    invested_sums = {}
    for investor in Investors:
        invested_sums[investor.InvestorID] = 0
        investments_by_investor = Investment.query.filter_by(Investor_ID=investor.InvestorID)
        for investment in investments_by_investor:
            invested_sums[investor.InvestorID] += investment.Investment_Value

    return render_template('Investors.html', title="List of Investors", investors=Investors, invested_sums=invested_sums)

然后您可以通过InvestorID在您的模板中引用invested_sums。