21

Field.db_index移行のあるアプリを使用して、モデル フィールドにインデックスを追加しようとしています。Django のドキュメントを見ると、次のように設定するだけですdb_index=True

class Person(models.Model):
    first_name = models.CharField()
    last_name = models.CharField(db_index=True)

そして、最初に新しい Django の移行を試しました。

./manage.py makemigrations app-name

しかし、移行は変更に気付かないようで、インデックスを作成するための sql コマンドを追加しません。だから私はここで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.
4

3 に答える 3

8

OK、を使用してインデックスを作成できました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-09-30T19:33:32.087 に答える