2011-05-08 2 views
2

입니다.django의 필터링 된 도서 목록 저자 수는

class Author(models.Model): 
    name = models.CharField(max_length=250) 

class Book(models.Model): 
    title = models.CharField(max_length=250) 
    author = models.ManyToManyField(Author) 

한보기 :

Authors in selected books: 
    Author1: book_count 
    Author2: book_count 
    ... 

답변

2

단계별로 쿼리를 작성해 보겠습니다.

먼저, book_list에 책이있는 저자를 찾으십시오.

authors = Author.objects.filter(book__in=book_list) 

트릭은 저자가 book_list에 각 책에 대해 한 번 표시됩니다 실현하는 것입니다. 그런 다음 주석을 사용하여 작성자가 나타나는 횟수를 계산할 수 있습니다. 템플릿에서

# remember to import Count! 
from django.db.models import Count 

authors = Author.objects.filter(book__in=book_list 
     ).annotate(num_books=Count('id') 

, 당신은 할 수 있습니다 : 영업 이익이 요구 한 아니에요 확실히 어떤

Authors in selected books: 
{% for author in authors %} 
{{ author.name }}: {{ author.num_books }}<br /> 
{% endfor %} 
+0

멋진 답변! 감사! – maksymov

0
#first way 
class Author(models.Model): 
    name = models.CharField(max_length=250) 

class Book(models.Model): 
    title = models.CharField(max_length=250) 
    author = models.ManyToManyField(Author, related_name='bookauthor_sets') 

템플릿에서 직접 사용 : 나는 템플릿에 다음 내용을 표시 할 수있는 방법

def filter_books(request): 
    book_list = Book.objects.filter(...) 

나는 두 가지 모델이
{{ author.bookauthor_sets.all.count }} 

의미

author.bookauthor_sets.all()

또한 다음과 같이 할 수 파이썬 #with) (수 :.

#second one 
class Author(models.Model): 
    name = models.CharField(max_length=250) 

    def get_books_count(self): 
     return Book.objects.filter(author=self).count() 

을 템플릿에서 :

{{ author.get_books_count }} 

이 정보가 도움이되기를 바랍니다.

+0

:'author.get_books_count는()'저자가이 책의 총 수를 반환합니다. OP는 저자가 선택한 책 수를 원합니다. – Alasdair

+0

아, 알겠습니다. 나는 오해 할 수도있다. – Tarvitz