web-dev-qa-db-ja.com

Django:インデックスの作成:一意ではない、複数の列

次のモデルを前提として、フィールド(シーケンス、ストック)にインデックスを付けたい

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);

それを行う「よりクリーンな」方法はありますか?

28
jbastos

Django 1.5以降、 Meta.index_togetherオプション

class QuoteModel(models.Model):
    # ... fields ...

    class Meta:
        index_together = [
            ("sequence", "stock"),
        ]

(注:2009年の元の回答では、複数のフィールドにインデックスを付けることはできませんでした。その後、置き換えられました)

18
excieve

この機能のチケットがあります。見てください http://code.djangoproject.com/ticket/5805

このチケットからパッチを自分で適用できます。

[〜#〜]更新[〜#〜]

現在Djangoにあります: https://docs.djangoproject.com/en/1.5/ref/models/options/#Django.db.models.Options.index_together

21
Ivan Virabyan

受け入れられた回答を続けるために、 South を使用している場合は、次のように複合キーを簡単に追加できます。

manage.py schemamigration your_app_name name_for_migration --add-index ModelName.first_field_in_index

次に、生成された移行ファイルを編集して、追加のフィールドを1つのインデックスに追加できます(必要なフィールド名のリストだけが表示されます)。

順方向の移行だけでなく、逆方向の移行も更新することを忘れないでください。

16
George Lund

Django 1.5のindex_togetherです

ここを参照してください https://docs.djangoproject.com/en/dev/ref/models/options/#index-together

14
cashmere

unique_together あなたが探しているものかもしれません。モデル内のMetaクラスに配置するだけです。

10
craesh

Django 1.11の時点で、作成するインデックスを指定できる新しい機能Options.indexesがあります。

Django Options.indexes

1
Lingster