запрос django - показать количество новых игроков, сгруппированных по месяцам - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь создать панель инструментов в django для игрового сайта.Мне нужно показать ежемесячный график «новых игроков, присоединившихся к игре».Я уже получаю общее количество игроков, и игроки присоединились в текущем месяце и за последние 7 дней, используя следующий код:

queryset = Players.object.all()
current_year = datetime.now().year
current_month = datetime.now().month
one_week_ago = datetime.today() - timedelta(days=7)
count['players_all'] = queryset.count
count['players_current_month'] = queryset.filter(joined__month=current_month, created_at__year=current_year).count
count['players_last_seven_days'] = queryset.filter(joined__gte=last_seven_days).count

Теперь я хочу добавить новый dict, который покажет мне количество игроков, которые присоединилисьпоследние 12 месяцев, сгруппированные по месяцам.Что-то вроде:

count['players_last_twelve_months'] = get_players_last_twelve_months()

Затем я хочу определить эту функцию get_players_last_twelve_months() так, чтобы она возвращала что-то вроде:

     {
        Jul:12
        Aug:15
        Sept:9
        Oct:22
        Nov:11
        Dec:7
        Jan:14
        Feb:19
        Mar:20
        Apr:12
        May:25
        Jun:8
       }

Я очень плохо знаком с python и django.Используя мои минимальные знания, я знаю, что могу использовать варианты queryset.filter, которые я использовал выше, как.

queryset.filter(joined__month=11, current_year = 2017)
queryset.filter(joined__month=12, current_year = 2017)
queryset.filter(joined__month=1, current_year = 2018)
queryset.filter(joined__month=2, current_year = 2018)

Однако я не хочу жестко кодировать номера месяцев и т. Д. Кто-нибудь может дать мне несколько советов о том, как правильно добиться этого?

1 Ответ

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

Вам необходимо отфильтровать, извлечь год и месяц и аннотировать.Что-то вроде:

from django.db.models.functions import ExtractYear, ExtractMonth
from django.db.models import Count

year_ago = datetime.date(...) # compute date year ago 

queryset.filter(joined__gte=year_ago).annotate(
    year=ExtractYear('joined'), month=ExtractMonth('joined')
).values('year','month').order_by('year','month').annotate(c=Count('id'))
...