2011-08-11 50 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