Группировка по месяцам и полу в наборе запросов Django - PullRequest
0 голосов
/ 30 июня 2018

У меня есть следующий набор запросов, он хорошо работает с группировкой по месяцам .

from django.db.models.functions import TruncMonth

queryset = UserProfile.objects.filter(date_created__year='2018')\
           .annotate(date=TruncMonth('date_created'))\
           .values('date').annotate(total_entries=Count('id'))

Я хочу также сгруппировать по полу , вот аналогичная модель с полем gender

class UserProfile:
    date_created = models.DateTime(auto_now_add=True)
    <b>gender = models.CharField(max_length=3,choices=[('F',"Female"),('M',"Male")],default='M')</b>

Ожидаемый результат:

May: 5 users [4(Male), 1(Female)]
June: 20 users [15(Male), 5(Female)]

1 Ответ

0 голосов
/ 30 июня 2018

Для django < 2.0 вы можете использовать Условные выражения и Sum(), чтобы комментировать нужные значения:

from django.db.models import Sum, Case, When
from django.db.models.functions import TruncMonth

queryset = UserProfile.objects.filter(date_created__year='2018').annotate(
    date=TruncMonth('date_created'),
).values('date').annotate(
    total_entries=Count('id'),
    total_male=Sum(Case(When(gender='M', then=1), default=0, output_field=models.IntegerField())),
    total_female=Sum(Case(When(gender='F', then=1), default=0, output_field=models.IntegerField())),
)

С django 2.0 можно использовать Условное агрегирование :

from django.db.models import Count, Q
from django.db.models.functions import TruncMonth

queryset = UserProfile.objects.filter(date_created__year='2018').annotate(
        date=TruncMonth('date_created'),
    ).values('date').annotate(
        total_entries=Count('id'),
        total_male=Count('id', filter=Q(gender='M')),
        total_female=Count('id', filter=Q(gender='F')),
)
...