SQLAlchemy将关注者计为标记

时间:2013-08-15 18:08:12

标签: python sql sqlalchemy flask-sqlalchemy

说我有标签型号:

class tag(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name =  db.Column(db.String(240))

    def FollowerRanked(self):        
        #return query(followers, func.count(followers.c.tag_id)).outerjoin(Tag)??
        #return Tag.query.Join(followers, (followers.c.tag_id == self.id).count()??
        #I am not sure how

假设我也有订阅表关系。

followers = db.Table('followers',
    db.Column('follower_id', db.Integer, db.ForeignKey('user.id')),
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)

我希望以DESC顺序遍历标签...以获得每个标签的关注者数量。我想我需要一个group_by。

我希望能够遍历:

tags.FollowersRanked()。项

我该怎么做?

编辑:

显然,这在模型中很难做到,所以我试图在视图中这样做:

tags = db.session.query(models.Tag, \
func.count(models.followers.c.follower_id).label('total'), models.Tag.name, \
models.Tag.title).join(models.followers).group_by(models.Tag).order_by('total DESC')
p = Pagination(tags, page, POSTS_PER_PAGE, tags.count(), tags)

唯一的问题是,它没有显示包含0个订阅者的标签。

1 个答案:

答案 0 :(得分:1)

join()更改为outerjoin()并使用coalesce()NULL更改为0 s:

tags = db.session.query(
    db.coalesce(db.func.count(models.followers.c.follower_id), 0).label('total'),
    models.Tag.name,
    models.Tag.title
).outerjoin(models.followers).group_by(
    models.Tag.name,
    models.Tag.title
).order_by('total DESC')

这应该可以解决问题。