2011-05-08 29 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) 

一種觀點:

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

我怎樣才能在模板中顯示一個內容:

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 2011-05-08 19:51:54

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') 

直接從模板中使用它:

{{ author.bookauthor_sets.all.count }} 

意味着

author.bookauthor_sets.all()COUNT()#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

這並不完全是什麼OP已經要求:'author.get_books_count()'返回的書的作者有總數。 OP需要作者選擇*書的數量。 – Alasdair 2011-05-08 16:52:17

+0

哦,我明白了。我可能會誤解。 – Tarvitz 2011-05-09 00:45:44