1
我想說明的是關係到一個特定的標記(以優化的方式)的標籤列表。 我不知道爲什麼Django的taggit不提供這項共同任務的內置功能。如何顯示與在Django taggit特定標籤的標籤?
我想說明的是關係到一個特定的標記(以優化的方式)的標籤列表。 我不知道爲什麼Django的taggit不提供這項共同任務的內置功能。如何顯示與在Django taggit特定標籤的標籤?
的解決方案,我必須提供確實比你要問什麼,因爲它允許查找相關標籤爲一組給定的標籤,而不是隻有一個給定的標籤多一點。實際上,這可能是你想要做的。我不確定它在性能方面是否真的最優,因爲它使用了子查詢,但它的工作原理和我覺得很容易理解。
首先,這裏是測試案例:
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
對象的屬性。
行'QS = Tag.objects.filter(taggit_taggeditem_items__item__in = related_items)'給我'關聯字段不支持嵌套lookups'。任何想法爲什麼? – Jack