Login

Case-insensitive lookup by default

Author:
sciyoshi
Posted:
July 9, 2007
Language:
Python
Version:
.96
Tags:
case-insensitive model manager queryset iexact tagging tags
Score:
3 (after 3 ratings)

I wanted lookups on tags to be case insensitive by default, so that things like

Tag.objects.get(name='Tag')

would return any similar tags (ignoring case differences), i.e. <Tag: tag>.

This snippet makes lookup on the 'name' field case-insensitive by default, although case-sensitive lookups can still be achieved with 'name__exact'. Methods like get_or_create will work as expected and be case-insensitive.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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')
<Tag: test>

More like this

  1. Switch template tag by adurdin 6 years, 9 months ago
  2. really spaceless (trim spaces at line start) by wolfram 7 years, 4 months ago
  3. CallTag - Just like include, but can pass parameters to it by limodou 8 years, 2 months ago
  4. Field map for models by tomzee 7 years, 5 months ago
  5. Customizable newforms labels with a template tag by exogen 7 years, 1 month ago

Comments

Please login first before commenting.