鉴于以下模型,我想索引字段(序列,库存)
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);
有没有“更干净”的方式呢?
答案 0 :(得分:21)
此功能有一张票。看看http://code.djangoproject.com/ticket/5805
您可以自行应用此故障单中的补丁。
<强>更新强>
现在在Django:https://docs.djangoproject.com/en/1.5/ref/models/options/#django.db.models.Options.index_together
答案 1 :(得分:16)
从Django 1.5开始,您可以使用Meta.index_together
option:
class QuoteModel(models.Model):
# ... fields ...
class Meta:
index_together = [
("sequence", "stock"),
]
(注意:2009年的原始答案说不可能索引多个字段;它已被替换)
答案 2 :(得分:15)
要接受已接受的答案,如果您使用South,则可以轻松添加复合键,如下所示:
manage.py schemamigration your_app_name name_for_migration --add-index ModelName.first_field_in_index
然后,您可以编辑生成的迁移文件,将其他字段添加到一个索引中(您将看到它只是一个需要的字段名称列表)。
不要忘记更新反向迁移以及前向迁移。
答案 3 :(得分:14)
django 1.5中的index_together
请参阅此处https://docs.djangoproject.com/en/dev/ref/models/options/#index-together
答案 4 :(得分:10)
unique_together
可能就是你要找的东西。只需将其放入模型中的Meta
课程中即可。
答案 5 :(得分:1)
将来可能不推荐使用 index_together 功能。
您应该使用indexes选项,而不要使用 index_together 。
索引选项的示例:
from django.db import models
class Customer(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
class Meta:
indexes = [
models.Index(fields=['last_name', 'first_name']),
models.Index(fields=['first_name'], name='first_name_idx'),
]
答案 6 :(得分:0)
我只是想补充一点,从Django 1.11开始,有一个新功能Options.indexes,它将允许您指定要创建的索引: