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

に変更join()outerjoin()て使用して、 s をscoalesce()に変更します。NULL0

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 に答える