Python 定义查询模型时使用的表达式
我试图通过降序计算游戏的平均等级和顺序。 在my models.py中,我定义了一个混合属性Python 定义查询模型时使用的表达式,python,python-3.x,flask,sqlalchemy,flask-sqlalchemy,Python,Python 3.x,Flask,Sqlalchemy,Flask Sqlalchemy,我试图通过降序计算游戏的平均等级和顺序。 在my 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.Integ
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文档中描述了您想要做的事情 这是一个纯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')
炼金术版本应该是这样的(但我这里没有,所以不能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')