django taggit防止跨不同模型的重叠标签

时间:2013-08-13 08:56:30

标签: python django-models django-taggit

我有两种不同的型号。

class MessageArchive(models.Model):
    from_user = models.CharField(null=True, blank=True, max_length=300)
    archived_time = models.DateTimeField(auto_now_add=True)
    label = models.ForeignKey(MessageLabel, null=True, blank=True)
    archived_by = models.ForeignKey(OrgStaff)
    tags = TaggableManager()

现在说,我已为邮件定义了spamtodourgent个标签。

然后我有另一个模型:

class PersonArchive(models.Model):
        from_user = models.CharField(null=True, blank=True, max_length=300)
        archived_time = models.DateTimeField(auto_now_add=True)
        label = models.ForeignKey(MessageLabel, null=True, blank=True)
        archived_by = models.ForeignKey(OrgStaff)
        tags = TaggableManager()

我为模特人定义awesomelegendrockstar。可能还有更多的定义。

很明显,我希望人和消息的标签重叠。 我该怎么做?谢谢!

3 个答案:

答案 0 :(得分:0)

您可以使用ForeignKeyFields和ManyToManyFields上的limit_choices_to功能。您的models.py文件可能如下所示:

class PersonArchive(models.Model):
    tags_field = models.ManyToManyField(Tag, related_name="people_archives", limit_choices_to={'message_archives__isnull': True})

class MessageArchive(models.Model):
    tags_field = models.ManyToManyField(Tag, related_name="message_archives", limit_choices_to={'people_archives__isnull': True})

答案 1 :(得分:0)

就你的情况而言,据我所知,你需要两种不同型号的不同标签基类。 考虑到我不是taggit的专家,所以我提出的解决方案可能有点过于简单,但是第一个通过查看源代码来引起我的想法。 您可以通过扩展TaggableManager使用的TaggableRel类并向limit_choices_to参数添加条件来实现:

扩展TaggableRel

class CustomTaggableRel(TaggableRel):
    def __init__(self, field, model_name):
        super(TaggableRel, self ).__init__(field)
        self.limit_choices_to = {'content_type': model_name}

比以下列方式扩展TaggableManager:

class CustomTaggableManager(TaggableManager):
    def __init__(self, model_name=None, verbose_name=_("Tags"),
        help_text=_("A comma-separated list of tags."), through=None, blank=False):
        super(TaggableManager, self ).__init__(verbose_name, help_text, through, blank)
        self.rel = CustomTaggableRel(self, model_name)

比你的模特:

class PersonArchive(models.Model):
        .
        .
        .
        tags = CustomTaggableManager(model_name="PersonArchive")

这应该可以解决问题,没有尝试解决方案而且我写​​得很快,但这可能会让你走上正确的道路。

答案 2 :(得分:0)

我自己处理这个。我决定让我的标签混杂在一起,因为我找到了一种只过滤特定型号标签的方法。这只会过滤modelname的标签。您可以根据需要展开过滤器。

Tag.objects.filter(taggit_taggeditem_items__content_type__model='modelname')