使用迁移向 Django 中的模型字段添加索引
Posted
技术标签:
【中文标题】使用迁移向 Django 中的模型字段添加索引【英文标题】:Adding indexes to model fields in Django with migrations 【发布时间】:2014-11-24 09:27:26 【问题描述】:我正在尝试使用 Field.db_index
为具有迁移的应用程序添加模型字段的索引。看着Django's documentation,我需要做的就是设置db_index=True
:
class Person(models.Model):
first_name = models.CharField()
last_name = models.CharField(db_index=True)
然后我先尝试了新的Django's Migration:
./manage.py makemigrations app-name
但是Migration似乎没有注意到变化,也没有添加用于创建索引的sql命令。所以我按照here 的解释尝试了django-admin.py
:
django-admin.py sqlindexes app-name
但这也不打印 sql 命令,它退出并出现以下错误:
CommandError: App 'app-name' has migrations. Only the sqlmigrate and sqlflush commands can be used when an app has migrations.
【问题讨论】:
【参考方案1】:您可以使用 Django 的 AddIndex 和 Index 类在迁移中明确执行此操作。
首先用manage.py makemigrations --empty
创建一个空的migration,然后简单地填写如下:
from django.db import migrations
from django.db.models.indexes import Index
from django.db.migrations import AddIndex
class Migration(migrations.Migration):
dependencies = [
('app_name', 'ref_to_previous_migration'),
]
operations = [
AddIndex('ModelName', Index(fields=['field_name'], name='my_index'))
]
您可以使用 Index
类上的选项来指定字段、添加名称以及执行特殊的自定义操作,例如仅索引表的一部分等。请查看上面的文档链接。
【讨论】:
【参考方案2】:这个问题在django2.1中依然存在。
我通过使用indexes Meta option 解决了这个问题。这比index_together
解决方案干净一些。
class Person(models.Model):
first_name = models.CharField()
last_name = models.CharField()
class Meta:
indexes = [
models.Index(fields=['last_name']),
]
【讨论】:
【参考方案3】:好的,我设法使用Meta.index_together
创建了索引。这不是最干净的方式,因为我实际上并没有同时索引多个字段,但它适用于 makemigrations
:
class Person(models.Model):
class Meta():
index_together = [['last_name']]
first_name = models.CharField()
last_name = models.CharField()
现在makemigrations
确实进行了新的迁移:
./manage.py makemigrations app-name
>>Migrations for 'app-name':
>> 0005_auto_20140929_1540.py:
>> - Alter index_together for Person (1 constraint(s))
而对应的sql命令其实是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;
【讨论】:
以上是关于使用迁移向 Django 中的模型字段添加索引的主要内容,如果未能解决你的问题,请参考以下文章
更改模型以添加“通过”关系以订购多对多字段 - Django 1.7 迁移修改