Skip to content

Instantly share code, notes, and snippets.

@saeedalijani
Forked from rtorr/gist:3148833
Last active July 21, 2019 09:55
Show Gist options
  • Save saeedalijani/5cfbb694de3673c1968e198e78684e03 to your computer and use it in GitHub Desktop.
Save saeedalijani/5cfbb694de3673c1968e198e78684e03 to your computer and use it in GitHub Desktop.
No duplicate (case-insensitive) entries django model. Djnago 1.6+, 2.0+
from django.db import models
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']
elif 'name__exact' in kwargs:
kwargs['name__iexact'] = kwargs['name__exact']
del kwargs['name__exact']
return super(CaseInsensitiveQuerySet, self)._filter_or_exclude(mapper, *args, **kwargs)
# custom manager that overrides the initial query set
class BrandManager(Manager):
def get_queryset(self):
return CaseInsensitiveQuerySet(self.model)
# and the model itself
class Brand(models.Model):
name = models.CharField(max_length=50, unique=True, db_index=True)
objects = BrandManager()
def __str__(self):
return self.name
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment