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);
Есть ли какой-нибудь "более чистый" способ сделать это?
Ответы
Ответ 1
Как и в Django 1.5, вы можете использовать параметр Meta.index_together
:
class QuoteModel(models.Model):
# ... fields ...
class Meta:
index_together = [
("sequence", "stock"),
]
(примечание: исходный ответ 2009 года сказал, что невозможно индексировать несколько полей, с тех пор оно было заменено)
Ответ 2
Есть билет для этой функции. Взгляните http://code.djangoproject.com/ticket/5805
Вы можете применить патч из этого билета самостоятельно.
UPDATE
Теперь он находится в Django: https://docs.djangoproject.com/en/1.5/ref/models/options/#django.db.models.Options.index_together
Ответ 3
Чтобы следовать из принятого ответа, если вы используете South, вы можете легко добавить составной ключ следующим образом:
manage.py schemamigration your_app_name name_for_migration --add-index ModelName.first_field_in_index
Затем вы можете отредактировать сгенерированный файл миграции, чтобы добавить дополнительные поля в один индекс (вы увидите его как раз список необходимых им имен полей).
Не забывайте обновлять обратную миграцию, а также форвардную.
Ответ 4
Это index_together в django 1.5
См. здесь https://docs.djangoproject.com/en/dev/ref/models/options/#index-together
Ответ 5
unique_together
может быть тем, что вы ищете. Просто поставьте его в свой Meta
класс внутри вашей модели.
Ответ 6
Я просто хотел добавить, что в Django 1.11 появилась новая функция Options.indexes, которая позволит вам указывать индексы для создания:
Django Options.indexes