如何在django-taggit中访问自定义模型

时间:2014-09-22 03:48:40

标签: django model tags 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访问直通模型。是否可以读取数据?我不想建立另一个关系或映射表。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:2)

我在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

然后类似于Taggit中的TaggedItem:

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_name中的GenericPostTaggedItemBase。它必须是%(class)s或类似的(请参阅taggit中的源代码)。因此,如果你有通用基础可以与其他类型的标签一起使用。此外,这是一种推荐的'对于抽象类(不要使用fixed related_name作为抽象类)。有关详细信息,请搜索related_name和%(class)。我会在这里跳过这个。

如果您有任何想法或建议,请告诉我。