2014-09-22 32 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)。我会在这里跳过这个。

如果您有任何意见或建议,请让我知道。

相关问题