from django.db.models import Manager from django.db.models.query import QuerySet class CaseInsensitiveQuerySet(QuerySet): def _filter_or_exclude(self, mapper, *args, **kwargs): # 'name' is a field in your Model whose lookups you want case-insensitive by default if 'name' in kwargs: kwargs['name__iexact'] = kwargs['name'] del kwargs['name'] return super(CaseInsensitiveQuerySet, self)._filter_or_exclude(mapper, *args, **kwargs) # custom manager that overrides the initial query set class TagManager(Manager): def get_query_set(self): return CaseInsensitiveQuerySet(self.model) # and the model itself class Tag(models.Model): name = models.CharField(maxlength=50, unique=True, db_index=True) objects = TagManager() def __str__(self): return self.name # now... >>> tag = Tag(name='test') >>> tag.save() >>> Tag.objects.get(name='TEST')