Это довольно легко сделать с помощью django-taggit.Подкласс TagBase и применение ограничения нижнего регистра в методе сохранения.Остальное - точка котла, поэтому TaggableManager может использовать ваш подкласс.
class LowerCaseTag(TagBase):
def save(self, *args, **kwargs):
self.name = self.name.lower()
super(LowerCaseTag, self).save(*args, **kwargs)
class LowerCaseTaggedItem(GenericTaggedItemBase):
tag = models.ForeignKey(LowerCaseTag, related_name="tagged_items")
class YourModel(models.Model):
tags = TaggableManager(through=LowerCaseTaggedItem)
Вы также можете установить ограничение диапазона для номеров тегов в методе сохранения.