0

Я использую Django tagging проект.Django tagging select_related

Это был очень стабильный проект. Работа на django 1.3.

Но у меня есть проблема.

# in models.py 
from tagging.fields import TagField 
class Blog(models.Model): 
    title = models.CharField(max_length = 300) 
    content = models.TextField() 
    tags = TagField() 
    author = models.ForeignKey(User) 

# in views.py 
def blog_list(request): 
    # I Want to use select related with tags 
    blogs = Blog.objects.all().select_related("user", "tags") # ???? 
    .... 

# in Templates 
{% load tagging_tags %} 
{% for blog in blogs %} 
    {% tags_for_object blog as tags %} 
    {{blog.title}} 
    {% for tag in tags %} 
     <a href="{% url tag_detail tag_id=tag.pk %}">{{tag}}</a> 
    {% endfor %} 
{% endfor %} 
+0

В чем проблема? – ilvar

+0

Я хочу уменьшить количество запросов. Проблема связана с подсчетом подсчета количества запросов. – Ankhaa

ответ

2

Джанго пометка использует общий внешний ключ к вашей модели, так что вы не можете просто использовать select_related.

Что-то, как это должно сделать трюк, хотя:

from django.contrib.contenttypes.models import ContentType 
from collections import defaultdict 
from tagging.models import TaggedItem 

def populate_tags_for_queryset(queryset): 
    ctype = ContentType.objects.get_for_model(queryset.model) 
    tagitems = TaggedItem.objects.filter(
     content_type=ctype, 
     object_id__in=queryset.values_list('pk', flat=True), 
    ) 
    tagitems = tagitems.select_related('tag') 
    tags_map = defaultdict(list) 
    for tagitem in tagitems: 
     tags_map[tagitem.object_id].append(tagitem.tag) 
    for obj in queryset: 
     obj.cached_tags = tags_map[obj.pk] 
+0

Спасибо. Так лучше. Сохраните более 50 запросов. – Ankhaa

0

Недавно я столкнулся с той же проблемой и решить ее без единого запроса БД. Действительно, нам не нужен тег id, чтобы получить URL-адрес. Поскольку имя тега уникально и является db_index, вы можете получить URL-адрес, используя имя поле вместо id. Например.

# your_app/urls.py 

url(r'tag/(?P<tag_name>[-\w]+)$', tag_detail_view, name='tag_detail') 

Кроме того, мечение TagField дает нам строку с именами тегов, как «питона, Джанго» . Таким образом, мы можем написать собственный шаблон фильтра:

# your_app/templatetags/custom_tags.py 

from django.urls import reverse 

@register.filter 
def make_tag_links(tags_str): 
    return ', '.join([u'<a href="%s">%s</a>' % (reverse(
     'tag_detail', args=[x]), x) for x in tags_str.split(',')]) 

И затем вы можете написать в шаблоне:

# your_list_template.html 

{% for blog in blogs %} 
    {{blog.title}} 
    {% if blog.tags %} 
     {{ blog.tags|make_tag_links|safe }} 
    {% endif %} 
{% endfor %} 

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

  • Нет связанных вопросов^_^