首页 > 解决方案 > Django ORM不同的值按确定的日期有一个MySQL DB

问题描述

我想用 Django 读取一些数据库日志,但我遇到了问题。

我的目标是计算过去 7 天内每天有多少用户发出请求。

我试过这个

logs_seven_days = Log.objects.filter( created_at__gte=datetime.now()-timedelta(days=7))\
                                        .extra({'date_of_request' : "date(created_at)"}) \
                                        .values('date_of_request') \
                                        .values('api_key__name') \
                                        .distinct() \
                                        .annotate(request_of_this_date_count=Count('id'))

我想要这样的东西:

distinct_user_requests        date
  4                         2/21/2020
  21                        2/22/2020
  5                         2/23/2020
  0                         2/24/2020
  43                        2/25/2020
  22                        2/26/2020

标签: pythondjangodjango-modelsdjango-orm

解决方案


您可以使用以下查询

logs_seven_days = Log.objects.filter(
        created_at__gte = timezone.now()-timedelta(days=7) #Filter Records
    ).annotate(
        date_of_request = TruncDate('created_at') #Annotate to trunc created_at to only date part
    ).values(
        'date_of_request' #Force to group by date truncated created_at_date
    ).annotate(
        distinct_user_requests = Count('user',distinct=True) #Use aggregate Count function over 'user' field using distinct.   
    ).values(
        'distinct_user_requests','date_of_request' #Get only count and create date values 
    ).order_by(
        'date_of_request' #And you may also order by annotated field value
    )

请参阅Django 文档了解更多信息。


推荐阅读