Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 2, 2011 07:16:32

magnet85
От:
Зарегистрирован: 2009-04-13
Сообщения: 91
Репутация: +  2  -
Профиль   Отправить e-mail  

Вопрос по annotate

В django новичок, не совсем понял как сделать следующее:

Есть модель:

class Category(models.Model):
name = models.CharField(max_length=30, verbose_name=u'Название категории')
slug_name = models.SlugField(max_length=30, verbose_name=u'URL категории')

class Article(models.Model):
headline = models.CharField(max_length=255, verbose_name=u'Заголовок')
slug = models.SlugField(max_length=255, verbose_name='URL')
pub_date = models.DateField(auto_now_add=True,
verbose_name=u'Дата публикации')
category = models.ForeignKey(Category, verbose_name=u'Категория')
short_text = models.TextField(verbose_name=u'Краткий текст')
body_text = models.TextField(verbose_name=u'Содержимое')

class Comment(models.Model):
author = models.CharField(max_length=60, verbose_name=u'Автор')
created = models.DateField(auto_now_add=True, verbose_name=u'Дата создания')
body = models.TextField(verbose_name=u'Содержимое')
article = models.ForeignKey(Article)
Есть представление:
def homepage(request, categ):
if categ == 'all':
articles = Article.objects.all()
else:
try:
categ = Category.objects.get(slug_name=categ)
except Category.DoesNotExist:
raise Http404
articles = Article.objects.filter(category=categ)
categ = categ.name
all_category = Category.objects.all()

paginator = Paginator(articles, 2) # Show 2 articles per page
page = request.GET.get('page')
try:
articles = paginator.page(page)
except (PageNotAnInteger, TypeError):
# If page is not an integer, deliver first page.
articles = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
articles = paginator.page(paginator.num_pages)

#q = Article.objects.annotate(Count('comment'))

return render_to_response('content.html', {'article': articles,
'categor': all_category, 'title': 'example.com',
'categ': categ, 'a_count': len(articles.object_list)})
В articles содержится статьи которые необходимо вывести, как лучше всего добавить к ним поле с количеством комментариев?
Допустим если делать так:
q = Article.objects.annotate(Count('comment'))
то будет вычисляться количество комментариев у всех статей, а если у меня их в базе допустим 200, а на страницу я вывожу всего 2, не слишком ли накладно получается?



Офлайн

#2 Сен. 2, 2011 10:00:58

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по annotate

можно в Article добавить:

@property
def num_comments(self):
return self.comment_set.count()
Или сделать отдельное поле и обновлять его при изменении комментариев, чтобы БД лишний раз не дергать.



Офлайн

#3 Сен. 2, 2011 14:48:50

magnet85
От:
Зарегистрирован: 2009-04-13
Сообщения: 91
Репутация: +  2  -
Профиль   Отправить e-mail  

Вопрос по annotate

Спасибо, работает.



Офлайн

#4 Сен. 2, 2011 15:00:44

magnet85
От:
Зарегистрирован: 2009-04-13
Сообщения: 91
Репутация: +  2  -
Профиль   Отправить e-mail  

Вопрос по annotate

Единственное не совсем понятно как это работает на уровне SQL запросов.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version