我有以下型号:
from django.db import models
class PopulationData(models.Model):
slot = models.IntegerField(db_index=True)
sample = models.IntegerField()
value = models.FloatField()
class Meta:
unique_together = (('slot', 'sample'),)
我想在列对上创建一个具有UNIQUE
约束的复合索引,如下所示:
CREATE INDEX my_compound_index ON myapp_populationdata (slot, sample);
现在我有一个单独的代码连接到发出前一个SQL语句的post_syncdb
信号。有没有办法从模型规范中指出它? (注意:我使用的是1.3分支)。
答案 0 :(得分:26)
从django-1.5开始,您可以使用index_together元选项创建复合索引: https://docs.djangoproject.com/en/dev/ref/models/options/#index-together
答案 1 :(得分:4)
从Django-1.11开始使用Meta.indexes选项https://docs.djangoproject.com/en/1.11/ref/models/indexes/:
from django.db import models
class PopulationData(models.Model):
slot = models.IntegerField(db_index=True)
sample = models.IntegerField()
value = models.FloatField()
class Meta:
unique_together = (('slot', 'sample'),)
indexes = [
models.Index(fields=['slot', 'sample']),
]
答案 2 :(得分:1)
我认为目前还没有在django ORM中实现。
如果您使用迁移工具(如南)可能是添加该sql语句的好地方,或者如果您想避免使用原始sql,则可以使用sqlalchemy(核心),但这种情况听起来很简单,只需要使用sql
答案 3 :(得分:0)
由于唯一约束还会创建索引,因此创建这两个索引将适得其反。
例如,来自 postgres docs
:
无需在唯一列上手动创建索引;这样做只会复制自动创建的索引。
为文档链接贷记Mark Byers
如果出于某些原因您仍然想要创建多列索引,则可以通过scores.computeIfPresent("you"){ _, v -> v + 2 }
来完成:
index_together