The documentation for Django 1.7 mentions RunSQL
classes can be used to create partial indexes on your tables. I have a table where I want the combination of title
, blog
& category
to be unique. However if category is not provided, the combination of title & blog should still be unique.
class Post(models.Model):
title = models.CharField(max_length=200)
blog = models.ForeignKey(Blog)
category = models.ForeignKey(Category, null=True, blank=True)
I can achieve this constraint with partial indexes (like the SQL shown below). Where do I add this code if I'm using Django 1.7 migrations?
CREATE UNIQUE INDEX idx1
ON Post (title, blog_id, category_id)
WHERE category_id IS NOT NULL;
CREATE UNIQUE INDEX idx2
ON Post (title, blog_id)
WHERE category_id IS NULL;
You could just provide an
unique_together
like so:NULLs for category will work how you want in that if not set then title/blog has to be unique.
https://docs.djangoproject.com/en/1.8/ref/models/options/#unique-together
Django 2.2 and later
As of version 2.2 Django supports declarative partial unique indexes on databases that support them (PostgreSQL and SQLite). So you could do something like:
Django 2.1 and earlier
In older versions you need to do this with migrations. First create a new, empty migration file:
Then, for each index add an appropriate
RunSQL
line:Finally, run
migrate
.