次のモデルを前提として、フィールド(シーケンス、ストック)にインデックスを付けたい
class QuoteModel(models.Model):
quotedate = models.DateField()
high = models.FloatField() #(9,2) DEFAULT NULL,
low = models.FloatField() #(9,2) DEFAULT NULL,
close = models.FloatField() #(9,2) DEFAULT NULL,
closeadj = models.FloatField() #(9,2) DEFAULT NULL,
volume = models.IntegerField() #(9,2) DEFAULT NULL,
stock = models.IntegerField(db_index=True) #(9,2) DEFAULT NULL,
open = models.FloatField() #(9,2) DEFAULT NULL,
sequence = models.IntegerField() #(9,2) DEFAULT NULL,
このインデックスは一意ではない必要があります-mysqlでは次のようになります。
create index ndx_1 on model_quotemodel(sequence,stock);
私が知っている唯一のDjango回避策は、テーブルの作成時にDjangoによって実行される "sql"ファイルを作成することです。そこで、 "stockmodelを作成しました。次のクエリを含むsql "(上記と同じ:)
create index ndx_1 on model_quotemodel(sequence,stock);
それを行う「よりクリーンな」方法はありますか?
Django 1.5以降、 Meta.index_together
オプション :
class QuoteModel(models.Model):
# ... fields ...
class Meta:
index_together = [
("sequence", "stock"),
]
(注:2009年の元の回答では、複数のフィールドにインデックスを付けることはできませんでした。その後、置き換えられました)
この機能のチケットがあります。見てください http://code.djangoproject.com/ticket/5805
このチケットからパッチを自分で適用できます。
[〜#〜]更新[〜#〜]
現在Djangoにあります: https://docs.djangoproject.com/en/1.5/ref/models/options/#Django.db.models.Options.index_together
受け入れられた回答を続けるために、 South を使用している場合は、次のように複合キーを簡単に追加できます。
manage.py schemamigration your_app_name name_for_migration --add-index ModelName.first_field_in_index
次に、生成された移行ファイルを編集して、追加のフィールドを1つのインデックスに追加できます(必要なフィールド名のリストだけが表示されます)。
順方向の移行だけでなく、逆方向の移行も更新することを忘れないでください。
Django 1.5のindex_togetherです
ここを参照してください https://docs.djangoproject.com/en/dev/ref/models/options/#index-together
unique_together
あなたが探しているものかもしれません。モデル内のMeta
クラスに配置するだけです。
Django 1.11の時点で、作成するインデックスを指定できる新しい機能Options.indexesがあります。