Как сделать вложенную группу по с аннотацией в 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, title: Life Without Fear, count: 2},
{publisher: New Age Books, title: Sushi Anyone?, count: 1},
{publisher: Binnet & Hardley, title: The Gourmet Microwave, count: 1},
{publisher: Binnet & Hardley, title: Silicon Valley, count: 1},
{publisher: Binnet & Hardley, title: Life Without Fear, count: 1},
{publisher: Algodata Infosystems, title: But Is It User Friendly?, count: 3} 

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

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

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

В Django есть особенность, которая не будет выполнять GROUP BY над значениями без предложения .order_by(). Поэтому вы можете добавить предложение .order_by() и обработать его с помощью:

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

При упорядочивании элементы "складываются" в группу, и мы, таким образом, подсчитываем количество первичных ключей для каждой группы.

Вернуться на верх