django group by (annotate), .values().annotate(), values( , ).distinct().annotate(Count())

An aggregate within a values() clause is applied before other argumentswithin the same values() clause. If you need to group by another value,add it to an earlier values() clause instead. For example:

>>> from django.db.models import Count
>>> Blog.objects.values('entry__authors', entries=Count('entry'))

>>> Blog.objects.values('entry__authors').annotate(entries=Count('entry'))


 https://docs.djangoproject.com/en/2.0/ref/models/querysets/#values

官网例子太简单,如果想过滤两列参数的不同值,并每个不一样的值的统计数量:

Mro.objects.values('LteScTadv', 'LteScAOA').distinct().annotate(Count('id'))










 可以使用:
    msgS = MessageTab.objects.values_list('msg_status').annotate(Count('id'))
  • 1

其中,id为数据库自动生成的自增字段。values_list的用法自行Google,或者print出来看一看。

此时,数据库实际执行的代码,可以通过:

    print msgS.query
  • 1

打印出来。可以看到:

SELECT `message_tab`.`msg_status`, COUNT(`message_tab`.`id`) AS `id__count` FROM `message_tab` GROUP BY `message_tab`.`msg_status` ORDER BY NULL
  • 1

很直观明了。通过msg_status来进行group by。如果想自定义id__count,比如指定为msg_num,则可以使用:annotate(msg_num=Count(‘id’))

当存在多个查询条件时,比如查询最近7天内,message_name属于某个分组内的消息,则可以使用Q函数:

    date_end = now().date() + timedelta(days=1)
    date_start = date_end - timedelta(days=7)
    messageTimeRange = (date_start, date_end)
    GroupList = getGroupIdLis(request.user)  # 返回当前用户能查询的group的一个列表。。仅做参考用
    qQueryList = [Q(message_time__range=messageTimeRange), Q(message_name__in=GroupList)] # 可以有多个Q函数查询条件

    msgS = MessageTab.objects.filter(reduce(operator.and_, qQueryList)).values_list('msg_status').annotate(msg_num=Count('id'))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

再次调用print msgS.query可看到SQL语句:

SELECT `message_tab`.`msg_status`, COUNT(`message_tab`.`id`) AS `msg_num` FROM `message_tab` WHERE (`message_tab`.`message_time` BETWEEN 2017-03-27 00:00:00 AND 2017-04-03 00:00:00 AND `message_tab`.`message_name` IN (1785785, 78757, 285889, 2727333, 7272957, 786767)) GROUP BY
 `message_tab`.`msg_status` ORDER BY NULL

你可能感兴趣的:(django group by (annotate), .values().annotate(), values( , ).distinct().annotate(Count()))