Django:unique_together暗示db_index = True与ForeignKey一样吗?

时间:2011-10-20 01:17:40

标签: python django django-models database-indexes

模型上的字段foo = models.ForeignKey(Foo)将自动为列添加数据库索引,以便更快地查找。这很好,但Django的文档没有说明模型元unique_together中的字段是否得到相同的处理。我碰巧有一个模型,其中unique_together中列出的一个char字段需要一个快速查找索引。我知道在字段定义中添加重复db_index=True不会有任何损害,但我很好奇。

5 个答案:

答案 0 :(得分:17)

对于来到这里的任何人,想知道除index_together之外他们是否需要unique_together才能获得索引的效果,Postgres的答案是no,他们是{ {3}}

答案 1 :(得分:12)

如果unique_together确实添加了索引,那么它将是一个多列索引。

如果您希望单独为其中一个列编制索引,我相信您需要在字段定义中指定db_index=True

答案 2 :(得分:5)

Django 1.5及更高版本中,您可以使用{Model}.Meta.index_together class属性。如果您有两个名为foobar的字段,则需要添加:

class Meta(object):
    index_together = unique_together = [
        ['foo', 'bar']
    ]

如果您只有一组唯一字段,则可以对unique_together使用一维可迭代。但是,the documentation并不表示同样适用于index_together

这也没关系:

class Meta(object):
    unique_together = 'foo', 'bar'
    index_together = [
        ['foo', 'bar']
    ]

然而,文档支持 NOT

class Meta(object):
    unique_together = 'foo', 'bar'
    index_together = 'foo', 'bar'

答案 3 :(得分:1)

根据the docs,它只会强制数据库级别的唯一性。我认为通常使一个字段唯一并不意味着它有一个索引。虽然如果索引存在,您也可以简单地检查数据库级别。一切都表明它没有。

答案 4 :(得分:1)

unique_together不会自动为列表中包含的每个字段添加索引。

新版Django建议改用“索引和约束”元选项:

https://docs.djangoproject.com/en/2.2/ref/models/options/#unique-together

https://docs.djangoproject.com/en/2.2/ref/models/options/#index-together