按每小时一对多关系计数查询订单 - SQLAlchemy

时间:2017-09-22 22:58:26

标签: python flask sqlalchemy relationship

我正在视频游戏拍卖网站上购买/销售游戏内物品。 我希望能够查询Auctions表并按照最热门的"对它们进行排序。拍卖。这取决于拍卖的出价/小时数。

以下是拍卖模式:

class Auctions(db.Model):
    id = db.Column(db.Integer, primary_key=True, index=True)
    posted = db.Column(db.DateTime())
    end = db.Column(db.DateTime())
    ...

    bids = db.relationship('Bids', backref='auctions', lazy='dynamic', order_by='desc(Bids.amount)', cascade="all, delete-orphan")

以下是投标模型:

class Bids(db.Model):
    id = db.Column(db.Integer, primary_key=True, index=True)
    bidder_id = db.Column(db.Integer, db.ForeignKey('user.id'), index=True)
    auction_id = db.Column(db.Integer, db.ForeignKey('auctions.id'), index=True)
    amount = db.Column(db.Integer)
    posted = db.Column(db.DateTime())

我可以按照这样的出价金额对它们进行排序:

hot_stmt = db.session.query(models.Bids.auction_id, func.count('*').label('bid_count')).group_by(models.Bids.auction_id).subquery()
hot = db.session.query(models.Auctions, hot_stmt.c.bid_count).outerjoin(hot_stmt, (models.Auctions.id == hot_stmt.c.auction_id)).order_by(hot_stmt.c.bid_count.desc()).limit(5)

我可以用这个计算并列出出价/小时:

for auc, count in hot:
    time_delta = datetime.utcnow() - auc.posted
    auc_hours = time_delta.seconds / 60 / 60
    print(auc.id, count / auc_hours)

我如何按出价/小时对查询进行排序,以便查询返回前5个最热门的拍卖?

1 个答案:

答案 0 :(得分:1)

一种有用的方法是创建一个字典,其中拍卖为关键,出价/小时为值:

d = {}
for auc, count in hot:
    time_delta = datetime.utcnow() - auc.posted
    auc_hours = time_delta.seconds / 60 / 60
    d[auc] = count / auc_hours

列出拍卖清单:

aucs = [auc for auc, count in hot]

根据值对列表aucs进行排序(使用reverse关键字将最高值放在列表的开头,因为sort函数默认情况下从最低到最高):

aucs.sort(key=d.get, reverse=True)
相关问题