python 필터 장고에 대한 카운트 및 그룹에 해당하는




파이썬 템플릿 (4)

이건 어떻습니까? (천천히 말고.)

counts= [ (c, Item.filter( category=c.id ).count()) for c in Category.objects.all() ]

많은 행을 가져 오는 경우에도 짧은 장점이 있습니다.

편집하다.

하나의 쿼리 버전. BTW, 이것은 종종 SELECT COUNT (*)보다 빠릅니다 . 그것을보십시오.

counts = defaultdict(int)
for i in Item.objects.all():
    counts[i.category] += 1

나는 다음과 같은 모델을 가지고있다.

class Category(models.Model):
    name = models.CharField(max_length=60)

class Item(models.Model):
    name = models.CharField(max_length=60)
    category = models.ForeignKey(Category)

나는 각 카테고리에 대한 항목의 선택 카운트 (그냥 카운트)를 원한다. 그래서 SQL에서는 다음과 같이 간단 할 것이다 :

select category_id, count(id) from item group by category_id

이 "장고 방식"과 동등한가? 아니면 일반 SQL은 유일한 옵션입니까? 나는 장고의 count () 메소드에 익숙하지만 그룹 이 거기에 어떻게 맞는지는 알지 못한다.


Django 1.1에서 그룹화하는 방법에 대해 다소 혼란 스러웠 기 때문에 나는 정확히 여기 사용법을 정확히 설명 할 것이라고 생각했습니다. 첫째, 미가엘이 말한 것을 되풀이합니다.

여기에서 방금 발견 한대로 Django 1.1 집계 API를 사용하여이를 수행하는 방법이 있습니다.

from django.db.models import Count
theanswer = Item.objects.values('category').annotate(Count('category'))

또한 from django.db.models import Count !

이렇게하면 카테고리 만 선택되고 category__count 라는 주석이 추가됩니다. 기본 순서에 따라 이것이 필요한 것일 수도 있지만 기본 순서가 category 가 아닌 필드를 사용하는 경우에는 작동하지 않습니다 . 그 이유는 주문에 필요한 필드도 선택되어 각 행을 고유하게하므로 원하는 방식으로 항목을 그룹화하지 않기 때문입니다. 이 문제를 해결하는 빠른 방법은 주문을 재설정하는 것입니다.

Item.objects.values('category').annotate(Count('category')).order_by()

이렇게하면 원하는 결과를 정확하게 얻을 수 있습니다. 특수 효과의 이름을 설정하려면 다음을 사용할 수 있습니다.

...annotate(mycount = Count('category'))...

그러면 결과에 mycount 라는 주석이 mycount .

그룹화에 관한 다른 모든 것들은 나에게 매우 직설적이었다. 더 자세한 정보는 Django aggregation API 를 확인하십시오.


( 업데이트 : 이제 전체 ORM 집계 지원이 Django 1.1에 포함되었습니다. 비공개 API 사용에 대한 아래 경고 사항을 참고하면 여기에 설명 된 방법은 더 이상 Django 1.1 이전 버전에서 작동하지 않습니다. 1.1 이후 버전이라면 어쨌든 실제 집계 API를 사용해야합니다.)

코어 집계 지원은 이미 1.0에있었습니다. 그것은 단지 문서화되지 않았고 지원되지 않으며 아직 그 위에 친숙한 API를 가지고 있지 않습니다. 그러나 1.1에 도달 할 때까지는 (어쨌든 query.group_by 속성은 공개 API의 일부가 아니므로 변경 될 수 있음을 모든 위험을 감안하여) 어쨌든 사용할 수 있습니다.

query_set = Item.objects.extra(select={'count': 'count(1)'}, 
                               order_by=['-count']).values('count', 'category')
query_set.query.group_by = ['category_id']

그런 다음 query_set을 반복하면 각 반환 값은 "카테고리"키와 "카운트"키가있는 사전이됩니다.

여기서 계산할 필요는 없습니다. 이것은 완료된 방법을 보여주기 위해 포함 된 것입니다 (쿼리 세트 건설 체인의 다른 곳이 아닌 .extra () 호출에서 수행되어야 함). 또한 count (1) 대신 count (id)를 사용할 수도 있지만 후자가 더 효율적일 수 있습니다.

또한 .query.group_by를 설정할 때 값은 Django 필드 이름 ( 'category')이 아닌 실제 DB 열 이름 ( 'category_id')이어야합니다. 이는 장고 용어가 아닌 DB 용어로 모든 차원에서 쿼리 내부를 조정하기 때문입니다.


여기에서 방금 발견 한대로 Django 1.1 집계 API를 사용하여이를 수행하는 방법이 있습니다.

from django.db.models import Count
theanswer = Item.objects.values('category').annotate(Count('category'))




django