【问题标题】:django taggit prevent overlapping tags across different modelsdjango taggit 防止跨不同模型的重叠标签
【发布时间】:2013-08-14 19:29:06
【问题描述】:

我有两种不同的型号。

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。可能还有更多的定义。

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

【问题讨论】:

    标签: python django-models django-taggit


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      据我了解,您的情况是,您希望两种不同型号的标​​签具有不同的基本系列。 考虑到我不是 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")
      

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

      【讨论】:

        【解决方案3】:

        您可以在 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})
        

        【讨论】:

        • 使用tags_fieldTaggableManager有什么区别??我的意思是,他们俩将如何相处?
        猜你喜欢
        • 1970-01-01
        • 2018-01-31
        • 2015-09-21
        • 1970-01-01
        • 2013-01-15
        • 1970-01-01
        • 1970-01-01
        • 2017-06-03
        • 2017-02-04
        相关资源
        最近更新 更多