2014-09-22 65 views
2

如何向標籤系統添加額外信息或通過django-taggit模型訪問?如何通過django-taggit訪問自定義模型

我的模型'發佈'有一個圖像和TaggableManager,以便每個帖子(或圖像)可以有多個標籤,用戶可以通過他們的標籤搜索所有帖子。現在,我需要指定每個圖像上標記標籤的位置(類似的概念,用戶在照片上的特定位置標註好友)。

我想我需要爲穿透模型添加額外信息,因爲座標只屬於帖子和標籤的關係,而不屬於標籤本身。這裏是model.py(簡體):

class TaggedPost(taggit.models.TaggedItemBase): 
    content_object = models.ForeignKey('Post') 
    x = models.IntegerField() 
    y = models.IntegerField() 

class Post(models.Model): 
    image = models.ImageField(upload_to='p/%Y/%m/%d/') 
    tags = TaggableManager(through=TaggedPost) 

但是,我不能通過TaggableManager的API訪問through模型。有沒有可能讀取數據?我不想建立另一個關係或映射表。

感謝您的任何建議。

回答

1

我在Google論壇上詢問了taggit,但沒有回覆。這是我的最終解決方案(可能不是最好的)

我建立我自己的GenericTaggedItemBase這樣的:

class GenericPostTaggedItemBase(ItemBase): 
    content_object = models.ForeignKey('Post', related_name='%(class)s') 
    x = models.IntegerField(null=True, default=None, blank=True) 
    y = models.IntegerField(null=True, default=None, blank=True) 

    class Meta: 
     abstract = True 

然後類似TaggedItem在Taggit:

class PostTaggedItem(GenericPostTaggedItemBase, TaggedItemBase): 

    class Meta: 
     verbose_name = _("Tagged Item") 
     verbose_name_plural = _("Tagged Items") 

在我的崗位型號:

class Post(models.Model): 
    # whatever fields go here 
    tags = TaggableManager(through=PostTaggedItem) 

爲了評估數據:

Post post = Post.objects.get(pk=1) 
models = post.posttaggeditem.all() 
for item in models: 
    # here is item.x and item.y 

這裏的關鍵是related_nameGenericPostTaggedItemBase。它必須是%(class)s或類似的(參見taggit中的源代碼)。所以通用基地可以與其他類型的標籤一起使用,如果有的話。此外,這是抽象類的「推薦」(不要使用抽象類的fixed related_name)。有關詳細信息,請搜索related_name和%(class)。我會在這裏跳過這個。

如果您有任何意見或建議,請讓我知道。

相關問題