获取 flask 博客的平均评分,SQL,Python

Get the average rating in flask blog, SQL, Python

我正在使用 SQL-alchemy 和 Python 创建一个 Flask 博客。该博客是一个食谱博客,用户可以在其中对食谱进行评分。我得到了所有的评级,但我也想得到平均评级。到目前为止我已经试过了,但我无法让它工作...

在我的 HTML:

 <div id="recipe" class="row">
    <div class="col">
        <ul class="list-group">
            <li class="list-group-item"><strong>Average Rating: </strong>{{ post.critic_avg }}</li>
        </ul>
    </div>

在我的路线文件中:

@app.route("/recipes/<int:recipe_id>")
def recipe(recipe_id):
    recipe = Recipe.query.get_or_404(recipe_id)
    form = RatingForm()
    critic_avg = db.session.query(func.avg(Rating.rating)).all()
    return render_template('recipe_page.html', title=recipe.title, post=recipe, form=form, critic_avg=critic_avg)

在我的模型中:

class Rating(db.Model):
    id = db.Column(db.Integer, primary_key=True, nullable=False)
    rating = db.Column(db.Integer, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    user = db.relationship(User, backref=db.backref('ratings', lazy=True))
    recipe_id = db.Column(db.Integer, db.ForeignKey('recipe.id'), nullable=False)
    recipe = db.relationship(Recipe, backref=db.backref('ratings', lazy=True))
    def __repr__(self):
        return f"<Rating (id='{self.id}', rating='{self.rating}', user_id='{self.user_id}', recipe_id='{self.recipe_id}')>"

也许我做的完全错了,很高兴得到一些指导:)

两件事, 首先,all() 将 return 列表中包含单个项目,在这种情况下,您可以使用 scalar() 来获得单个值

critic_avg = db.session.query(func.avg(Rating.rating)).scalar() or 0

并且在神社中,您尝试使用 post.critic_avg 访问 critic_avg,而使用 post 不可用,您将其作为 critic_avg 传递给神社,因此,在神社中你可以直接访问它

<li class="list-group-item"><strong>Average Rating: </strong>{{ critic_avg }}</li>

https://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.scalar