количество книг по жанрам для каждого автора в django - PullRequest
1 голос
/ 07 мая 2011

Один простой вопрос. У меня есть 3 модели:

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

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

class Book(models.Model):
    title = models.CharField(max_length=250)
    author = models.ForeignKey(Author)
    genre = models.ForeignKey(Genre)

Как мне сделать шаблон со следующим содержимым:

Author1:
    Genre1 - book count
    Genre2 - book count
    ...
Author2:
    Genre1 - book count
    Genre2 - book count
    ...

1 Ответ

2 голосов
/ 07 мая 2011

Это должно работать:

>>> stats = Book.objects.values('author__name','genre__name').annotate(Count('id')).order_by('author')
>>> for x in stats:
...     print x['author__name'], x['genre__name'], x['id__count']
... 
A1 G1 3
A1 G2 1
A2 G1 1
A2 G2 1
>>> new_book = Book(title='new_book', author=Author.objects.get(pk=2), genre=Genre.objects.get(pk=1))
>>> new_book.save()
>>> stats = Book.objects.values('author__name','genre__name').annotate(Count('id')).order_by('author')
>>> for x in stats:
...     print x['author__name'], x['genre__name'], x['id__count']
... 
A1 G1 3
A1 G2 1
A2 G1 2
A2 G2 1
>>> 

Затем используйте regroup:

передать статистику в шаблон:

{% regroup stats by author__name as author_stats_list %}

<ul>
{% for author in author_stats_list %}
    <li>{{ author.grouper }}
    <ul>
        {% for item in author.list %}
        <li>{{ item.genre__name }} {{ item.id__count }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...