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