사용법
이전 ORM의 group by method는 Django 1.8에서는 더 이상 사용할 수 없으며, 이를 구현하려면 annotate를 사용해야 합니다
예제 1
첫 번째 값이 사용됩니다. 그룹화해야 하는 필드를 선택하고(여기서는 user_id별로 그룹화) 필수 필드를 그룹화하고 집계하기 위해 주석을 답니다(각 user_id에 해당하는 질문 ID 수와 Catalog_id의 최소값이 필요합니다) ), 그런 다음 값을 사용하여 실제로 필수 필드(원래 user_id 및 집계 필드의 별칭)를 쿼리합니다.
첫 번째 값은 그룹화 기준에 사용되는 필드를 지정하는 데 사용되며 Count, Min이어야 합니다. 및 기타 집계 함수(예: F(" user_id") 별칭 사용 불가), 최종 쿼리가 필요하지 않으면 집계할 필요가 없습니다.
두 번째 값 이 사용됩니다. 실제 선택한 필드를 지정하려면 주석 뒤에 필드 이름만 지정할 수 있습니다. 예를 들어 user_id는 그룹화에 사용되는 필드이고 직접 가져올 수 있지만 다른 필드는 집계되어야 하며 집계된 별칭인 qid 및 cid를 사용해야 합니다. . 원본 테이블에도 필드 상태가 있는 경우 이 필드는 주석으로 집계되지 않으므로 최종 값을 필드에 쿼리할 수 없습니다.)
q = PxbNCEUserQuest.objects.filter(user_id=335).values("user_id").annotate(qid=Min("question_id"), cid=Min("catalog_id")).values("user_id", "qid", "cid") print q print q.query # 输出 [{'qid': 22, 'user_id': 335L, 'cid': 17}] SELECT `pxb_nce_user_quest`.`user_id`, MIN(`pxb_nce_user_quest`.`question_id`) AS `qid`, MIN(`pxb_nce_user_quest`.`catalog_id`) AS `cid` FROM `pxb_nce_user_quest` WHERE `pxb_nce_user_quest`.`user_id` = 335 GROUP BY `pxb_nce_user_quest`.`user_id` ORDER BY NULL
예 2
예 1과 동일, 하지만 여기서 첫 번째 주석은 필드를 그룹화하는 데 사용되고 두 번째 주석은 다른 필드에 개별적으로 별칭을 지정하는 데 사용됩니다
q = PxbNCEUserQuest.objects.filter(user_id=335).values("user_id").annotate(qid=Min("question_id"), cid=Min("catalog_id")).annotate(uid=F("user_id")).values("uid", "qid", "cid") print q print q.query # 输出: [{'qid': 22, 'uid': 335L, 'cid': 17}] SELECT MIN(`pxb_nce_user_quest`.`question_id`) AS `qid`, MIN(`pxb_nce_user_quest`.`catalog_id`) AS `cid`, `pxb_nce_user_quest`.`user_id` AS `uid` FROM `pxb_nce_user_quest` WHERE `pxb_nce_user_quest`.`user_id` = 335 GROUP BY `pxb_nce_user_quest`.`user_id` ORDER BY NULL
예:
SomeModel.objects.annotate(Count('somecol' ))
GROUP BY: 모든 필드
SomeModel.objects.values ('name').annotate(Count('somecol'))
GROUP BY: 이름 필드 , somecol 집계
SomeModel.objects.annotate(Count('somecol')).values ('name')
GROUP BY: 모든 필드, 쿼리 이름
SomeModel .objects.values('name', 'pk').annotate(Count('somecol')).values('pk')
GROUP BY: 이름, pk 필드, 쿼리 pk 필드
SomeModel.objects.values('name').annotate(Count('somecol')).values('pk')
GROUP BY: 이름, pk 필드, 쿼리 pk 필드
관련지식 :
위의 질의 방식은 처음에는 이해하기 어려울 수 있으나, 원본 SQL문의 그룹별 방식을 비교해 보면 유사한 원리를 발견할 수 있다
이전 버전의 mysql에서는
a로 t 그룹에서 a, b를 선택하면 정상적으로 작동하며 b 필드는 자동으로 첫 번째 필드를 가져옵니다. 이는 암시적 집계와 동일합니다.
위 명령문 엄격한 모드 sql_mode=ONLY_FULL_GROUP_BY가 기본적으로 활성화되어 있기 때문에 새 버전의 mysql에서는 작동할 수 없습니다. 올바른 방법은 다음과 같습니다.
t 그룹에서 a,max(b)를 b로 선택합니다. 모든 쿼리를 집계하기 위해 표시해야 하는 필드
새 버전의 mysql 구문을 비교해 보면 ORM의 쿼리 방법과 매우 유사하다는 것을 알 수 있습니다