gpt4 book ai didi

python - 定义查询模型时使用的表达式

转载 作者:行者123 更新时间:2023-12-03 16:57:26 25 4
gpt4 key购买 nike

我正在尝试通过递减来计算游戏和订单的平均评分。
在我的models.py中,我定义了一个混合属性

class Review(db.Model):
id = db.Column(db.Integer, primary_key=True)
rating = db.Column(db.Numeric(precision=2, scale=1), index=True)
body = db.Column(db.String(140))
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
game_id = db.Column(db.Integer, db.ForeignKey('game.id'))

class Game(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(255), index=True, unique=True)
reviews = db.relationship('Review', backref='game', lazy='dynamic')

@hybrid_property
def avg_rating(self):
total_rating = 0
reviews = Review.query.filter_by(game_id=self.id).all()
for review in reviews:
total_rating += review.rating

return total_rating / len(reviews)


但是当我尝试在routes.py中查询平均评分时

games = Game.query.order_by(Game.avg_rating.desc())


我得到这个错误

AttributeError: 'decimal.Decimal' object has no attribute 'desc'


我可能需要在我的models.py中执行类似的操作,但是如何?

@avg_rating.expression
def avg_rating(cls):
# what to write here

最佳答案

sqlalchemy文档中将您要执行的操作描述为Correlated Subquery Relationship Hybrid

这是一个纯SqlAlchemy版本:

import sqlalchemy as sa

@avg_rating.expression
def avg_rating(cls):
return sa.select([sa.func.avg(Review.rating)]).where(Review.game_id == cls.id).label('avg_rating')


flask-sqlalchemy版本应如下所示(但我在这里没有,所以不能100%确定):

@avg_rating.expression
def avg_rating(cls):
return db.select([db.func.avg(Review.rating)]).where(Review.game_id == cls.id).label('avg_rating')

关于python - 定义查询模型时使用的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51803875/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com