Сложность Django с отображением данных (количество)

Я новичок в django и пытаюсь научиться создавать форум.

моя модель

class Subject(models.Model):
    name=models.CharField(max_length=128)
    created=models.DateTimeField('Created Date')


    def __str__(self):
        return self.name

class Book(models.Model):
    book_subject=models.ForeignKey(Subject,on_delete=models.CASCADE)
    book_title=models.CharField(max_length=128)
    url=models.URLField()
    votes=models.IntegerField(default=0)


    def __str__(self):
        return self.book_title

мой запрос к базе данных в оболочке django

Subject.objects.all()
>>>[<Subject: electronics>, <Subject: compter science>]

q=Subject.objects.get(id=2)
q.book_set.all()
>>>[<Book: python django>, <Book: python flask>]

Как мне получить количество книг по каждому предмету. (чтобы получить количество книг по предметам по электронике и информатике) Я знаю, что это может быть прямым ответом. Я хотел показать шаблон как на форуме, где он отображает название темы и количество содержащихся в нем книг.

Может ли кто-нибудь помочь мне с запросом, чтобы получить количество книг по каждому предмету?

Любая помощь очень ценится .. Заранее спасибо


person spidy    schedule 12.02.2016    source источник
comment
Пожалуйста, выберите более подходящий заголовок для вашего вопроса. Ваша проблема не в отображении данных, а в подсчете количества.   -  person Daniel Roseman    schedule 12.02.2016
comment
@ Дэниел Роузман ... внес изменения   -  person spidy    schedule 12.02.2016


Ответы (1)


Если вам нужно только количество книг по определенной теме, есть count

Subject.objects.get(id=2).book_set.count()

Если вам нужны предметы с подсчетом количества книг для них, вы можете annotate

from django.db.models import Count
subjects = Subject.objects.annotate(num_books=Count('book'))

for subj in subjects:
    print subj.num_books 
person Sayse    schedule 12.02.2016
comment
@Sayse..Я получаю сообщение об ошибке FieldError: Не удается преобразовать ключевое слово «книги» в поле. Возможные варианты: книга, создано, идентификатор, имя - person spidy; 12.02.2016
comment
@AmoghAngadi - должно быть book - person Sayse; 12.02.2016
comment
@AmoghAngadi - Не беспокойтесь, в моем ответе есть ссылка на документацию по нему. - person Sayse; 12.02.2016
comment
@Sayse..Как я могу подсчитать количество книг отдельно по электронике и информатике? - person spidy; 12.02.2016
comment
@Sayse .. ваш ответ не дает отдельного подсчета 2 книг ..... помогите мне, пожалуйста ..... подсчитать количество книг по электронике и информатике - person spidy; 12.02.2016
comment
@AmoghAngadi - вы обновили свой вопрос, чтобы он стал другим вопросом, этот ответ действительно решает ваш первоначальный вопрос, если у вас есть другой вопрос, вы должны поднять его как отдельный вопрос (с тем, что вы пробовали / исследовали) - person Sayse; 12.02.2016
comment
@Sayse...... Я на самом деле имел в виду то же самое ... но внес изменения, чтобы прояснить ситуацию, приятель - person spidy; 12.02.2016
comment
@spidy Этот ответ должен дать вам то, что вы хотите. Если вы хотите это в одном объекте, попробуйте это: Subject.objects.annotate(num_books=Count('book')).values('name', 'num_books') - person csinchok; 12.02.2016