You your case, as far as I understand, you want different base families of tag for the two different models. Take in account I'm not an expert on taggit, so the solution I'm proposing can be a bit overcomplitated, but is the first that jump me in mind by looking at the source code. You can achieve that by extending the TaggableRel class used by TaggableManager and add a condition to the limit_choices_to parameter:

Extend TaggableRel

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

Than you extend TaggableManager in the following way:

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)

Than you your models:

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

This should do the trick, didn't try the solution and I write it down very fast, but this could drive you on the right path.