我正在视频游戏拍卖网站上购买/销售游戏内物品。 我希望能够查询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个最热门的拍卖?
答案 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)