2011-08-11 96 views

回答

4

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

首先,这里是测试案例:

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'))的每个标签的项目数量。这将作为一个count每个Tag对象的属性。

+1

行'QS = Tag.objects.filter(taggit_taggeditem_items__item__in = related_items)'给我'关联字段不支持嵌套lookups'。任何想法为什么? – Jack