>  기사  >  백엔드 개발  >  django orm에서 그룹별 주석 사용

django orm에서 그룹별 주석 사용

高洛峰
高洛峰원래의
2016-11-23 09:43:043418검색

사용법

이전 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의 쿼리 방법과 매우 유사하다는 것을 알 수 있습니다


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.