24


6

次のモデルを考えて、私はフィールド(シーケンス、在庫)にインデックスを付けたいです。

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ではそれはそのようなものであるべきです:

model_quotemodel(sequence、stock)にインデックスndx_1を作成します。

私が知っている唯一のDjangoの回避策はテーブル作成時にdjangoによって実行される "sql"ファイルを作成することです。 そこで、次のクエリを含む "stockmodel.sql"を作成しました(上記と同じ)。

model_quotemodel(sequence、stock)にインデックスndx_1を作成します。

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

5 Answer


21


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

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

更新

現在はDjangoに入っています。


15


あなたが Southを使用しているなら、受け入れられた答えから続けるために、あなたは次のように簡単に複合キーを追加することができます:

manage.pyスキーマ移動your_app_name name_for_migration --add-index ModelName.first_field_in_index

その後、生成された移行ファイルを編集して、追加のフィールドを1つのインデックスに追加できます(必要なのはフィールド名のリストにすぎません)。

リバースマイグレーションとフォワードマイグレーションを更新することを忘れないでください。


14


Django 1.5では、https://docs.djangoproject.com/en/1.9/ref/models/options/#index-together [`Meta.index_together`オプション]を使うことができます。

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

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

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


10


http://docs.djangoproject.com/en/dev/ref/models/options/#unique-together [unique_together]はあなたが探しているものかもしれません。 モデル内のあなたの `Meta`クラスに入れるだけです。