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

5933 단어
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일 동안 메시지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

좋은 웹페이지 즐겨찾기