django查询 - 显示按月分组的新玩家数量

时间:2018-06-03 18:44:03

标签: python django django-queryset

我正在尝试在django中为游戏网站创建一个仪表板。我需要展示每月加入游戏的新玩家#34;图形。我已经获得了总玩家数,玩家在当月和过去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 :(得分:1)

您需要过滤,提取年份和月份并进行注释。 类似的东西:

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'))