2014-10-21 8 views
0

У меня есть модель, которая выглядит следующим образом:После внешних ключей в Django

class Shelf(models.Model): 
     name = models.CharField(max_length=20) 

class Book(models.Model): 
     shelf = models.ForeignKey(Shelf) 
     name = models.CharField(max_length=20) 

class Page(models.Model): 
     book = models.ForeignKey(Book) 
     name = models.CharField(max_length=20) 

и я хотел бы получить список полка с резюме о том, что они содержат:

Shelf | Books | Pages 
------------------------ 
    Home | 12 | 2000 
    Office | 8 | 1300 

Я могу легко подсчитать количество книг с book_set.count, но это, похоже, не распространяется дальше (мышление book_set.page_set.count). Что-то вроде sum([p.page_set().count for p in book_set.all()]) работает, но очень медленно.

Есть ли хороший способ достичь этого, или я вынужден генерировать нечасто и кэшировать эту информацию?

ответ

0

Если вы правильно поняли, вы хотите найти общее количество страниц для каждой полки. Это то, что делает aggregation.

from django.db.models import Count 
shelves = Shelf.objects.all().annotate(page_count=Count('book__page') 
Смежные вопросы