0

나는 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

나는 쿼리 횟수를 줄이길 원한다. 문제는 Query Count 관련 블로그 수입니다. – 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

나는 최근에 같은 문제가 발생하여 하나의 DB 쿼리없이 해결했다. 사실, 우리는 URL을 얻으려면 id 태그를 필요로하지 않습니다. 태그 이름은 고유하고 db_index이므로 id 대신 이름 필드를 사용하여 URL을 가져올 수 있습니다. 예 :

# 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 %}