Как сделать вложенные групповые запросы в django orm?

У меня есть следующие данные:

publisher                    title
--------------------------  -----------------------------------
New Age Books                Life Without Fear
New Age Books                Life Without Fear
New Age Books                Sushi, Anyone?
Binnet & Hardley             Life Without Fear
Binnet & Hardley             The Gourmet Microwave
Binnet & Hardley             Silicon Valley
Algodata Infosystems         But Is It User Friendly?
Algodata Infosystems         But Is It User Friendly?
Algodata Infosystems         But Is It User Friendly?

Вот что я хочу сделать: Я хочу подсчитать количество книг, опубликованных каждым автором в одном объекте. Я хочу получить следующий результат:

{publisher: New Age Books, titles: {Life Without Fear: 2, Sushi Anyone?: 1}},
{publisher: Binnet & Hardley, titles: {The Gourmet Microwave: 1, Silicon Valley: 1, Life Without Fear: 1}},
{publisher: Algodata Infosystems, titles: {But Is It User Friendly?: 3}} 

Мое решение выглядит примерно так:

query_set.values('publisher', 'title').annotate(count=Count('title'))

Но это не приводит к желаемому результату.

Вы можете пост-обработать результаты запроса с помощью groupby(…) функции [Python-doc] из пакета itertools [Python-doc]:

from django.db.models import Count
from itertools import groupby
from operator import itemgetter

qs = query_set.values('publisher', 'title').annotate(
    count=Count('pk')
).order_by('publisher', 'title')

result = [
    {
        'publisher': p,
        'titles': {r['title']: r['count'] for r in rs }
    }
    for p, rs in groupby(qs, itemgetter('publisher'))
]
Вернуться на верх