3

我有两种不同的型号。

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()

现在说,我已经为消息定义了spam, todo,urgent标签。

然后我有另一个模型:

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()

我为模型人定义awesome, legend, 。rockstar可能还有更多的定义。

很清楚,我希望人员和消息的标签重叠。我应该如何做到这一点?谢谢!

4

3 回答 3

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")

这应该可以解决问题,没有尝试解决方案,我很快就把它写下来,但这可能会让你走上正确的道路。

于 2013-08-23T08:36:43.770 回答
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})
于 2013-08-13T12:05:18.413 回答
0

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

Tag.objects.filter(taggit_taggeditem_items__content_type__model='modelname')
于 2020-01-20T21:07:51.260 回答