Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 定义查询模型时使用的表达式_Python_Python 3.x_Flask_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

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

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

我试图通过降序计算游戏的平均等级和顺序。 在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.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')