我有两种不同的型号。
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
。可能还有更多的定义。
很明显,我不希望人和消息的标签重叠。 我该怎么做?谢谢!
答案 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')