【问题标题】:Adding indexes to model fields in Django with migrations使用迁移向 Django 中的模型字段添加索引
【发布时间】: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.

【问题讨论】:

    标签: django django-models django-admin django-migrations django-2.1


    【解决方案1】:

    您可以使用 Django 的 AddIndexIndex 类在迁移中明确执行此操作。

    首先用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;
        

        【讨论】:

          猜你喜欢
          • 2014-08-10
          • 2012-05-19
          • 2015-10-06
          • 1970-01-01
          • 1970-01-01
          • 2011-07-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多