I am trying to add indexes on model fields using Field.db_index
for an app that has migrations. Looking at Django's documentation all I need to do is to set db_index=True
:
class Person(models.Model):
first_name = models.CharField()
last_name = models.CharField(db_index=True)
and then I first tried the new Django's Migration:
./manage.py makemigrations app-name
but Migration does not seem to notice the change and does not add the sql command for creating an index. So I tried django-admin.py
as explained here:
django-admin.py sqlindexes app-name
But that does not print the sql command either and it exits with the following error:
CommandError: App 'app-name' has migrations. Only the sqlmigrate and sqlflush commands can be used when an app has migrations.
OK, I managed to create the indexes using
Meta.index_together
. It is not the cleanest way, since I am not actually indexing multiple fields together but it works withmakemigrations
:Now
makemigrations
does make a new migration:And the corresponding sql command is actually
CREATE INDEX
.This problem still exists in django2.1. I solved it by using the indexes Meta option. This is a bit cleaner than the
index_together
solution.You can do this explicitly in your migration using Django's AddIndex and Index classes.
First create an empty migration with
manage.py makemigrations --empty
and then simply fill it out as follows:You can use options on the
Index
class to specify fields, add a name, and do special custom things like index only part of the table, etc. Check the doc links above.