Django:创建索引:非唯一,多列
Posted
技术标签:
【中文标题】Django:创建索引:非唯一,多列【英文标题】:Django: create Index: non-unique, multiple column 【发布时间】:2010-12-07 09:13:22 【问题描述】:给定以下模型,我想索引字段(序列,股票)
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
option:
class QuoteModel(models.Model):
# ... fields ...
class Meta:
index_together = [
("sequence", "stock"),
]
(注意:2009 年的原始答案说不可能索引多个字段;它已被替换)
【讨论】:
我不确定这个答案是否真的解决了非主键复合键?好像没有。 这根本不是问题所要寻找的。需要非唯一、非主、复合键。 我不认为上面的 cmets 与当前的答案相关......从文档看来,index_together
确实 提供了非唯一的、非主要的综合指数
2020 年更新:indexes
.【参考方案2】:
此功能有一张票。看看http://code.djangoproject.com/ticket/5805
您可以自己应用此票证中的补丁。
更新
现在在 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】:在 django 1.5 中是 index_together
请看这里https://docs.djangoproject.com/en/dev/ref/models/options/#index-together
【讨论】:
【参考方案5】:unique_together
可能是您正在寻找的。只需将其放在模型中的 Meta
类中即可。
【讨论】:
他要求 index_together。你告诉他unique_together。不是他问的。 虽然这不是这个问题的答案,但这有助于我准确搜索多列唯一索引。所以,还是谢谢 是的,我想“唯一索引”和“唯一约束”之间有点混淆。无论如何,我发现这个问题也在寻找唯一约束。+1【参考方案6】: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'),
]
【讨论】:
【参考方案7】:我只是想补充一点,从 Django 1.11 开始,有一个新功能,Options.indexes,它允许您指定要创建的索引:
Django Options.indexes
【讨论】:
以上是关于Django:创建索引:非唯一,多列的主要内容,如果未能解决你的问题,请参考以下文章