【问题标题】:define expression used when querying the model定义查询模型时使用的表达式
【发布时间】:2018-08-11 21:26:01
【问题描述】:

我正在尝试按降序计算游戏的平均评分和顺序。 在我的 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

【问题讨论】:

    标签: python python-3.x flask sqlalchemy flask-sqlalchemy


    【解决方案1】:

    你想要做的在 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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 2020-07-04
      • 1970-01-01
      • 2020-10-05
      相关资源
      最近更新 更多