Подсчет и группировка Джанго по значениям двух полей - PullRequest
0 голосов
/ 07 января 2019

У меня есть такая модель:

CLASS_TYPE = ( ("A","A Class"), ("B", "B Class") , ("C", "C Class") , ("D", "D Class") ) 

class Student(models.Model):
   systemId    = models.CharField(max_length=15, unique=True )
   studentNo   = models.CharField(max_length=15, unique=True )
   country     = models.CharField(max_length=50)
   clasType    = models.CharField(max_length=2, choices=CLASS_TYPE )
   recordDate = models.DateField() 
...

И есть много записей.

Меня интересуют только два поля: " страна " и " classType ".
Я хочу сосчитать все типы классов, в зависимости от страны и суммы.

Я хочу получить list словарей из Student модели:

[
    { "country":"USA" , "A" : Count_Of_A_Class_in_USA , "B" : Count_Of_B_Class_in_USA , "C" : countCinUSA , "D": count_D_in_USA , "Total" : total_students_in_USA } ,
    {"Country":"England" , "A" : A_in_England ...., "C":C_in_England... , "Total" : students_in_England }
]

Как я могу получить это?

1 Ответ

0 голосов
/ 07 января 2019

Сначала мы можем сделать запрос, который для каждой страны и для clasType получает число Student s:

qs = Student.objects.values('country', 'clasType').annotate(
    n=Count('pk')
).order_by('country', 'clasType')

Теперь мы можем использовать itertools.groupby [Python-doc] для группировки этих словарей в более компактные словари:

from itertools import groupby
from operator import itemgetter

data = [
    {'country': c, ** { li['clasType']: li['n'] for li in l } }
    for c, l in groupby(qs, itemgetter('country'))
]

Но нам все еще нужно сделать «исправления»: возможно, что в стране есть не все clasType s, мы, вероятно, хотим добавить 0 s для них, и, кроме того, нам нужно вычислить общее количество. Мы можем сделать это с:

for subd in data:
    total = 0
    for ct, _ in CLASS_TYPE:
        total += subd.setdefault(ct, 0)
    subd['Total'] = total

Теперь data содержит список словарей, каждый словарь имеет ключ 'country' и 'Total', а для каждого ключа CLASS_TYPE и число Student s для этого CLASS_TYPE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...