2014-01-08 4 views
0

주제 및 사용자가 특정 숫자입니다. 사용자는 하나 이상의 주제에 대해 투표 할 수 있습니다. 나는 투표 순서에 따라 투표 수로 분류 된 상위 10 개 주제를 표시하는보기를 만들고 싶습니다.ManyToMany 관계로 정렬 된 목록 표시

실제로 나는 작업 방식을 찾았지만이를 수행하는 데 더 적합한 방법이 있는지 스스로에게 묻고 있습니다.

나는 모델로 시작 :

Subject.user_set.all() 

나는이 주제에 대해 투표 한 해당 사용자를 얻을 것이다 :

class Subject(models.Model): 
    text = models.TextField() 

class User(models.Model): 
    name = models.CharField(max_length=64) 
    subject = models.ManyToManyField(Subject) 

가 지금은 입력 할 수 있습니다.

이제 상위 10 개 주제가 투표 수순으로 정렬되어 표시되는 목록보기를 만들고 싶습니다. 은 그래서 제목 클래스에 클래스 메소드 추가 :

class Subject(models.Model): 
    text = models.TextField() 

    @staticmethod 
    def by_votes(): 
     myList = list(Subject.objects.all()) 
     return sorted(myList, key=lambda s: s.user_set.count(), reverse=True)[:10] 

를 그 클래스를 기반으로보기 정의 :

class SubjectListView(ListView): 
    model = Subject 
    template_name = "subject_list.html" 
    context_object_name = "subject_list" 
    queryset = Subject.by_votes() 

실제로 잘 작동합니다. 하지만 docs Manager와 QuerySet 클래스에서 불행히도 (원시 SQL 쿼리를 처리하지 않고) 내가 찾고있는 것을 얻기 위해 (커스텀 것들을 정의하는) 어떻게 사용하는지 이해하지 못했습니다.

많은 수의 과목을 가지고있는 메모리 문제를 일으킬 수있는 목록을 사용했기 때문에 조금 두려워합니다. 사용자 정의 관리자 또는 QuerySet을 사용하는 것이 더 적합할까요? 예인 경우 어떻게합니까?

다른 대안 아이디어가 있습니까?

감사합니다. 피터

답변

1

필요가 없습니다.

from django.db.models import Count 
Subject.objects.annotate(user_count=Count('user').order_by('-user_count')[:10] 
+0

대단히 고마워요! – Bingo

1

나는이 상당히 새로운 해요하지만이와 비슷한 문제를 해결 : 사용자 정의 관리자 나 여기 원시 SQL, 단지 통합에 대한

Subject.objects.all().annotate(count=Count('user')).order_by('-count')[:10] 

Aggregation Doc

+0

감사! 집계에 관한이 문서를 읽을 것입니다! – Bingo