我正在尝试在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)
但是我不想硬编码月份数字等。任何人都可以提供一些关于尝试实现此目标的正确方法吗?
答案 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'))