Подтвердить что ты не робот

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, о котором я знаю, это создание файла sql, который будет выполняться django при создании таблицы. Итак, я создал файл "stockmodel.sql", содержащий следующий запрос (тот же, что и выше:)

create index ndx_1 on model_quotemodel(sequence,stock);

Есть ли какой-нибудь "более чистый" способ сделать это?

4b9b3361

Ответ 1

Как и в Django 1.5, вы можете использовать параметр Meta.index_together:

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

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

(примечание: исходный ответ 2009 года сказал, что невозможно индексировать несколько полей, с тех пор оно было заменено)

Ответ 3

Чтобы следовать из принятого ответа, если вы используете South, вы можете легко добавить составной ключ следующим образом:

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

Затем вы можете отредактировать сгенерированный файл миграции, чтобы добавить дополнительные поля в один индекс (вы увидите его как раз список необходимых им имен полей).

Не забывайте обновлять обратную миграцию, а также форвардную.

Ответ 5

unique_together может быть тем, что вы ищете. Просто поставьте его в свой Meta класс внутри вашей модели.

Ответ 6

Я просто хотел добавить, что в Django 1.11 появилась новая функция Options.indexes, которая позволит вам указывать индексы для создания:

Django Options.indexes