【问题标题】:how to show tags related to a particular tag in django taggit ?如何在 django taggit 中显示与特定标签相关的标签?
【发布时间】:2012-04-23 05:10:12
【问题描述】:

我想显示与特定标签相关的标签列表(以优化的方式)。 我想知道为什么 django-taggit 没有为这个常见任务提供内置功能。

【问题讨论】:

    标签: django django-taggit


    【解决方案1】:

    我必须提供的解决方案比您要求的要多一点,因为它允许为一组给定标签找到相关标签,而不仅仅是一个给定标签。实际上,这可能是您想要做的。我不确定它在性能方面是否真的是最优的,因为它使用了子查询,但它可以工作并且我觉得它很容易理解。

    首先,这里是测试用例:

    from django.test import TestCase
    from .models import Item, get_related_tags
    
    
    class RelatedTagsTest(TestCase):
    
        def setUp(self):
            article1 = Item.objects.create(title='Python vs. COBOL')
            article1.tags.add('programming', 'python', 'cobol')
            article2 = Item.objects.create(title='Python vs. Boa Constrictor')
            article2.tags.add('zoology', 'python', 'boa')
            article3 = Item.objects.create(title='COBOL vs. FORTRAN')
            article3.tags.add('cobol', 'fortran', 'programming')
    
        def test_unique_tag(self):
            self.assertEquals(get_related_tags('programming'),
                              ['cobol', 'fortran', 'python'])
            self.assertEquals(get_related_tags('python'),
                              ['boa', 'cobol', 'programming', 'zoology'])
    
        def test_multiple_tags(self):
            self.assertEquals(get_related_tags('boa', 'fortran'),
                              ['cobol', 'programming', 'python', 'zoology'])
    

    如您所见,“相关标签”是指与使用一组给定标签标记的项目相关联的标签集。

    这是我们的模型,带有获取相关标签的功能:

    from django.db import models
    from taggit.managers import TaggableManager
    from taggit.models import Tag
    
    class Item(models.Model):
        title = models.CharField(max_length=100)
        tags = TaggableManager()
    
    
    def get_related_tags(*tags):
        # Get a QuerySet of related items
        related_items = Item.objects.filter(tags__name__in=tags)
    
        # Get tags for those related items (I found the name of the lookup field by
        # reading taggit's source code)
        qs = Tag.objects.filter(taggit_taggeditem_items__item__in=related_items)
    
        # Exclude the tags we already have
        qs = qs.exclude(name__in=tags)
    
        # Order by name and remove duplicates
        qs = qs.order_by('name').distinct()
    
        # Return tag names to simplify test code, real code would probably return
        # Tag objects
        return [t.name for t in qs]
    

    请注意,您可以使用qs.annotate(count=Count('name')) 轻松添加每个标签的项目数。它将作为每个Tag 对象的count 属性提供。

    【讨论】:

    • qs = Tag.objects.filter(taggit_taggeditem_items__item__in=related_items) 行给了我Relation fields do not support nested lookups。知道为什么吗?
    猜你喜欢
    • 2011-09-10
    • 1970-01-01
    • 2012-07-04
    • 2020-09-21
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多