Упорядочить по многим ко многим отношениям, не возвращая кортеж со счетом - PullRequest
0 голосов
/ 02 ноября 2018

Со следующими упрощенными классами и таблицами

tags = db.Table(
        "tags",
        db.Column("tag_id", db.Integer, db.ForeignKey("tag.id")),
        db.Column("post_version_id", db.Integer, db.ForeignKey("post_version.id"))
        )

class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)

class PostVersion(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    current = db.Column(db.Boolean, default=False, index=True)

Я пытаюсь выполнить вызов для всех Tag, упорядоченных по числу PostVersion, которые оба подключены через tags и имеют значение current=True.

Я разработал следующий запрос:

db.session.query(Tag,
        db.func.count(PostVersion.id).label("total")
        ).outerjoin(tags
        ).outerjoin(PostVersion,    
                and_(PostVersion.id==tags.c.post_version_id,
                PostVersion.current==True)
        ).group(Tag).order_by("total DESC").all()

Что дает следующие (правильные) результаты:

[(<Tag 8: original>, 136),
 (<Tag 16: constance-garnett>, 136),
 (<Tag 3: explanation>, 3),
 (<Tag 2: definition>, 1),
 (<Tag 14: translation>, 1),
 (<Tag 1: biblical>, 0),
 (<Tag 4: homage>, 0),
 (<Tag 5: intertextuality>, 0),
 (<Tag 6: meter>, 0),
 (<Tag 7: mythology>, 0),
 (<Tag 9: political>, 0),
 (<Tag 10: cultural>, 0),
 (<Tag 11: reference>, 0),
 (<Tag 12: shakespeare>, 0),
 (<Tag 13: technical-issues>, 0),
 (<Tag 15: context>, 0)]

За исключением , я должен внести дополнительные изменения в результаты, чтобы подавить вывод на основе кортежа, который включает в себя результаты db.func.count(PostVersion.id).label("total"), и я совершенно не уверен, как переписать запрос для подавления только это.

Как я могу сформулировать свой запрос, чтобы просто вернуть объекты в порядке, который возвращает этот запрос?

1 Ответ

0 голосов
/ 02 ноября 2018

Решение простое: переместите выражение count в предложение ORDER BY:

db.session.query(Tag).\
    outerjoin(tags).\
    outerjoin(PostVersion,
              and_(PostVersion.id==tags.c.post_version_id,
                   PostVersion.current==True)).\
    group_by(Tag.id).\
    order_by(db.func.count(PostVersion.id).desc()).\
    all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...