Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 6, 2013 11:50:53

VadimK
Зарегистрирован: 2013-07-03
Сообщения: 199
Репутация: +  16  -
Профиль   Отправить e-mail  

django-taggit оптимизация

Есть список сообщений, каждое из которых имеет стои теги. Для тегов подключил
django-taggit + django-taggit-autosuggest

Проблема в том, что когда вывожу список сообщений и к ним тэги, число запросов в базу огромно.
Т.е:
1. запрос вытягивается список сообщений
2. показывается сообщение и идет запрос за тегами к сообщению
3. на каждый тэг идет снова запрос в базу, что бы получить его имя

Вот третий пункт и есть проблемная вещь. По идее вместо третьего пункта надо один раз вытянуть теги в массив, и потом уже брать имена из этого массива. Как это реализовать средствами django ?

Или есть какие то более удобные решения ?

models

class Post(models.Model):
title = models.CharField(max_length=255)
short_text = models.TextField()
long_text = models.TextField()
pub_date = models.DateTimeField('date published')
tags = TaggableManager(through=PostTaggedItem)

view
def home(request):
posts = Post.objects.all()
return render(request, 'home.html', {'posts': posts})

template
{% for post in posts %}
<div>
<h3>{{ post.title }}</h3>
{{ post.short_text }}
<div class="post_tags">
Теги:
{% for item in post.tagged_items.all %}

{% with item.tag as tag %}
<b>{{ tag.name }} </b>
{% endwith %}
{% endfor %}
</div>
</div>
{% endfor %}

лог запросов для наглядности
SELECT ••• FROM `blog_post`
SELECT ••• FROM `taggit_taggeditem` WHERE (`taggit_taggeditem`.`object_id` = 1 AND `taggit_taggeditem`.`content_type_id` = 8 )
SELECT ••• FROM `taggit_tag` WHERE `taggit_tag`.`id` = 7
SELECT ••• FROM `taggit_tag` WHERE `taggit_tag`.`id` = 9
SELECT ••• FROM `taggit_tag` WHERE `taggit_tag`.`id` = 8
SELECT ••• FROM `taggit_taggeditem` WHERE (`taggit_taggeditem`.`object_id` = 2 AND `taggit_taggeditem`.`content_type_id` = 8 )
SELECT ••• FROM `taggit_tag` WHERE `taggit_tag`.`id` = 7
SELECT ••• FROM `taggit_tag` WHERE `taggit_tag`.`id` = 4

Отредактировано VadimK (Сен. 6, 2013 11:55:39)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version