如何在标签系统中添加额外信息或通过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访问直通模型。是否可以读取数据?我不想建立另一个关系或映射表。
感谢您的任何建议。
答案 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)。我会在这里跳过这个。
如果您有任何想法或建议,请告诉我。