0

私はDjango taggingプロジェクトを使用しています。Djangoタグ付け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

は、私は最近、同じ問題が発生したため、単一の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をタグ付けすることは'のpython、ジャンゴ'のように、私たちにタグ名を持つ文字列を与えます。

# 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 %} 
関連する問題