Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding indexes to model fields in Django with migrations

Tags:

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. 
like image 553
Nima Avatar asked Sep 29 '14 21:09

Nima


2 Answers

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.

class Person(models.Model):     first_name = models.CharField()     last_name = models.CharField()      class Meta:         indexes = [             models.Index(fields=['last_name']),         ] 
like image 131
ilse2005 Avatar answered Oct 13 '22 11:10

ilse2005


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 with makemigrations:

class Person(models.Model):     class Meta():         index_together = [['last_name']]     first_name = models.CharField()     last_name = models.CharField() 

Now makemigrations does make a new migration:

./manage.py makemigrations app-name  >>Migrations for 'app-name': >>  0005_auto_20140929_1540.py: >>    - Alter index_together for Person (1 constraint(s)) 

And the corresponding sql command is actually CREATE INDEX.

./manage.py sqlmigrate app-name 0005_auto_20140929_1540  >>BEGIN; >>CREATE INDEX app-name_person_last_name_7...4_idx ON `app-name_person` (`last_name`); >>COMMIT; 
like image 25
Nima Avatar answered Oct 13 '22 09:10

Nima