Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Веб-разработка и фреймворки > Модели Django — получение количества комментариев


Автор: resurtm 23.6.2009, 19:32
Привет всем!

Есть у меня модели:

Код

class Post(models.Model):
    title = models.CharField(max_length=40, primary_key=True)
    url_title = models.CharField(max_length=40)
    author = models.CharField(max_length=20)
    date = models.DateTimeField()
    text = models.TextField()
    short_text = models.TextField()
    tags = models.ManyToManyField(Tag)
    objects = PostManager()
 
    def __unicode__(self):
        return '%s, %s' % (self.title, self.author)
 
    class Meta:
        ordering = ['-date']

class Comment(models.Model):
    post = models.ForeignKey(Post)
    author = models.CharField(max_length=20)
    date = models.DateTimeField()
    text = models.TextField()
 
    def __unicode__(self):
        return '%s, %s, %s' % (self.post, self.author, self.date)
 
    class Meta:
        ordering = ['-date']


Вопрос такой: как можно добавить в результаты, которые выдаёт конструкция Post.objects.all() количество комментариев в каждом из постов? Т.е. чтобы можно было делать так, как нечто вроде Post.objects.all()[0].comments_count.

Можно конечно поступить просто и тупо: для каждого поста выполнять запрос SELECT COUNT(*) FROM Comment WHERE Comment.post = 'текущий пост' и передавать массив количеств комментариев в каждом посте в шаблон. Но это как-то тупо, и уверен, что есть способ более гибкий и более красивый.

Кто что думает по этому поводу?

Автор: Daevaorn 23.6.2009, 19:52
А какая у вас Джанга? Если post 1.0, то есть такой вариант:
Код

from django.db.models import Count

Post.objects.annotate(comments_count=Count('comment'))


http://docs.djangoproject.com/en/dev/ref/models/querysets/#annotate-args-kwargs

Автор: resurtm 23.6.2009, 19:57
Цитата(Daevaorn @ 23.6.2009,  19:52)
А какая у вас Джанга? Если post 1.0, то есть такой вариант:
Код

from django.db.models import Count

Post.objects.annotate(comments_count=Count('comment'))


http://docs.djangoproject.com/en/dev/ref/models/querysets/#annotate-args-kwargs

Не работает. Пишет, что у Manager отсутствует метод annotate. Тем не менее спасибо, до проблемы сам дотукал. Сделал как-то так:

Код

def articles(request):
    posts = Post.objects.all()
    return render_to_response('articles.html', {'posts': posts})

...

    {% for item in posts %}
            <div class="article-main">
                {{ item.short_text|safe }}
                <br />
                {{ item.comment_set.count }}
            </div>
    {% endfor %}


Всё работает так, как надо. =)

Добавлено через 4 минуты и 13 секунд
Спасибо за помощь, тем не менее! smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)