0

假设我有一个标签模型:

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().items

我该怎么做呢?

编辑:

显然,这在模型中变得难以做到,所以我试图在视图中做到这一点:

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 个订阅者的标签。

4

1 回答 1

1

Change join()toouterjoin()和用于coalesce()NULLs 更改为0s:

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')

这应该够了吧。

于 2013-08-16T10:28:01.397 回答