2014-05-12 2 views
0

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

Для примера, предположим, у нас есть эти модели:

class Category(models.Model): 
    ... 

class SubCategory(models.Model): 
    category = models.ForeignKey(Category) 
    .... 

class Tag(models.Model): 
    .... 

class Article(models.Model) 
    sub_category = models.ForeignKey(SubCategory) 
    tag = models.ForeignKey(Tag) 

Тогда мы имеем DetailView для категории, в которой все SubCatoegories для этой категории перечислены. В этом списке мы хотим подсчитать каждую запись в подкатегории, по количеству статей, которые она содержит, что также имеет определенный тег (то есть, не число на все статей этой подкатегории, которая кажется много более тривиально строить). Что-то вроде этого:

{% for sub_category in category.sub_category_set.all %} 
    {{ sub_category.name }} -- {{ sub_category.articles_set.filter(tag='xyz').all|length }} 

Я предполагаю, что это должно быть сделано в views.py и/или models.py каким-то образом, в конце концов. Я просто написал это так, чтобы уточнить, что я имею в виду. Итак, как я могу добиться чего-то подобного?

+0

Два вопроса: 1. имеет sub_category FK в статью? 2. Что не так с sub_category.articles_set.filter (tag = 'xyz'). Count()? – zymud

+0

1. Нет, только статья для sub_category. 2. Я не думаю, что вы можете делать фильтрацию в шаблонах. –

ответ

1

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

from django.db.models import Count 

def my_view(request, other, arguments): 
    ... 
    subcategories = category.sub_category_set.filter(tag__tagname='xyz') \ 
          .annotate(num_articles=Count('article__id')) 
    ... 

subcategories Pass в контекст шаблона, а в шаблоне вы можете сделать это:

{% for subcategory in subcategories %} 
    {{ subcategory.name }} -- {{ subcategory.num_articles }} 
{% endfor %} 
+0

Работал как шарм! Большое спасибо! –

+0

Как я могу заставить это работать, даже если есть 0 статей с тегом = 'xyz'? –

+0

Вы, кажется, хорошо знаете это, поэтому, возможно, вы можете взглянуть на мой новый вопрос, который расширяет его: http://stackoverflow.com/questions/23636343/get-count-on-several-filtered-subqueries -в-шаблон –

Смежные вопросы