【发布时间】:2016-05-23 23:08:03
【问题描述】:
我想按帖子收到的点赞数对查询结果进行排序。 这是我的桌子:
class Card(Base):
__tablename__ = 'cards'
id = Column(Integer, primary_key=True)
post_id = Column(Integer)
voted = Column(Boolean)
@hybrid_property
def likes(self):
likes = session.query(Card).filter(and_(Card.post_id == self.post_id, Card.voted == True)).count()
return likes
@likes.expression
def likes(cls):
return (select([func.count(Card.id)]).where(and_(Card.post_id == cls.post_id, Card.voted == True))
这是查询:
cards = session.query(Card).filter(Card.user_id == current_user.get_id()).order_by(desc(Card.likes)).all()
SQL 中的 order_by 部分,对我来说似乎很正确:
ORDER BY (SELECT count(cards.id) AS count_1 FROM cards WHERE cards.post_id = cards.post_id AND cards.voted = true) DESC
但是当我在查询之后调用它时:
for card in cards:
print card.likes
输出不是降序而是完全随机的顺序。我现在唯一的猜测是,由于过滤器,计数仅在具有 card.user_id == current_user.id 的卡上执行。如果是这样(?),我如何按帖子收到的总点赞数排序我的查询结果?
我之前查过的东西:Hybrid Attributes 1,SQLAlchemy order by hybrid property 2,
谢谢。
【问题讨论】:
-
那个SQL肯定不对。
cards.post_id = cards.post_id始终为真,所以每一行的count_1等于表中带有voted = true的卡片总数,这意味着排序只会给你没有特定顺序的行。您能否详细说明Card、Post和“喜欢”如何联系在一起?否则我们无法真正提出解决方案。 -
您确定要查询
Card而不是Post实例(按其卡片获得的票数排序)?
标签: python sql postgresql flask sqlalchemy