Case insensitive Charfield in django models

To answer my own question:

I have found I can have clean method on my model. So I added

class Category(models.Model):
    name = models.CharField(max_length=200, unique=True)

    def clean(self):
        self.name = self.name.capitalize()

It is capitalising the first letter, which is then handled by the save method, which calls the validate_unique method to raise error.


You can use Postgre specific model field called Citext fields (case insensitive fields).

There are three option at the moment:

class CICharField(**options), class CIEmailField(**options) and class CITextField(**options)

Example:

from django.db import models

from django.contrib.postgres.fields import CICharField


class Category(models.Model):
    name = CICharField(verbose_name="Name", max_length=255)

But don't forget to create an extension for the citext fields. See here.

Basically, you have to add the extension class in the migration file, inside the operations array, before the first CreateModel operation.

# migration file

    operations = [
        CITextExtension(),        # <------ here
        migrations.CreateModel(
            ...
        ),
        ...,
    ]