-1

我使用Django 标记项目。

那是一个非常稳定的项目。在 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 %}
4

2 回答 2

2

django-tagging 对您的模型使用通用外键,因此您不能只使用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]
于 2012-03-29T21:04:00.140 回答
0

我最近遇到了同样的问题并在没有单个数据库查询的情况下解决了它。事实上,我们不需要标签id来获取 url。由于标签名称是唯一的并且是 db_index 您可以使用name字段而不是id获取 url 。例如

# your_app/urls.py

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

此外,标记 TagField 为我们提供了一个带有标记名称的字符串,例如'python,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 %}
于 2017-01-30T12:07:35.157 回答