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 2012-03-29 02:30:23

+0

我想減少查詢計數。問題是查詢計數相關博客計數。 – Ankhaa 2012-03-29 02:34:09

回答

2

Django的標記使用通用外鍵模型,所以你不能只用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 2012-03-31 07:30:48

0

我最近遇到了同樣的問題,解決它沒有一個單一的數據庫查詢。事實上,我們不需要標記id即可獲取網址。由於標記名稱是唯一的,並且是db_index,因此您可以使用名稱而不是ID來獲取URL。例如。

# your_app/urls.py 

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

此外,標註TagField爲我們提供了與標籤名稱的字符串,如「巨​​蟒,Django的。所以,我們可以寫一個自定義模板過濾器:

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