Django 1.11中的数据库索引:db_true,索引和index_together之间的差异

时间:2017-06-08 22:01:35

标签: python django django-orm django-1.11

Django 1.11提供了创建数据库索引的新方法。到目前为止,我们在每个字段中都有db_index=True

# example 1

class Person(models.Model):
    name = models.CharField(db_index=True)
    age = models.IntegerField(db_index=True)

现在我们有models.Index并且可以在indexes块中声明class Meta - 甚至index_together

那说我有两个疑问:

1。示例1中的代码是否与下面的示例2完全相同?

# example 2

class Person(models.Model):
    name = models.CharField()
    age = models.IntegerField()

    class Meta:
        indexes = [
            models.Index(fields=['name']),
            models.Index(fields=['age'])
        ]

2。那么index包含多个字段和index_together:下面的示例3和4是完全相同的吗?

# example 3

class Person(models.Model):
    name = models.CharField()
    age = models.IntegerField()

    class Meta:
        indexes = [
            models.Index(fields=['name', 'age'])
        ]
# example 4

class Person(models.Model):
    name = models.CharField()
    age = models.IntegerField()

    class Meta:
        index_together = [['name', 'age']]

1和2之间有什么不同,3和4之间有什么不同?我错过了什么?非常感谢。

1 个答案:

答案 0 :(得分:6)

根据文档,您可以为索引指定名称,并且可以为索引中的每个字段设置顺序(但并非所有DB都受到同等支持)。 但实际上,这一点的全部意义在于为定义支持的其他类型的索引带来额外的灵活性。

目前从Django 1.11开始,只有在使用Postgres时才能定义GIN和BRIN索引,如果这些符合您的需求。 (参见https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/indexes/上的django.contrib.postgres.indexes)

能够像你描述的那样定义索引只是最常见的情况,除非你想使用上面提到的一个特性(命名索引或排序字段),你可以使用索引,因为你一直在做(直到现在)( db_index和index_together)。