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

oro*_*aki 20 python django django-models database-indexes

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

Tom*_*Tom 20

对于来到这里的人来说,想知道他们是否需要index_together除了unique_together获得索引的性能优势之外,Postgres的答案是否定的,它们在功能上是相同的.

  • 汤姆.感谢那. (2认同)

Ala*_*air 12

如果unique_together添加索引,则它将是多列索引.

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


auv*_*ipy 8

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


Joe*_*ico 5

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

class Meta(object):
    index_together = unique_together = [
        ['foo', 'bar']
    ]
Run Code Online (Sandbox Code Playgroud)

如果只有一组唯一字段,则可以对使用一维可迭代unique_together。但是,文档中没有指出index_together

这也可以:

class Meta(object):
    unique_together = 'foo', 'bar'
    index_together = [
        ['foo', 'bar']
    ]
Run Code Online (Sandbox Code Playgroud)

但是,文档支持此功能:

class Meta(object):
    unique_together = 'foo', 'bar'
    index_together = 'foo', 'bar'
Run Code Online (Sandbox Code Playgroud)

  • 对于相同的2个字段,具有2个字段的“ index_together”不同于“ db_index = True”。使用index_together可以将多个索引合并为1,以便在数据库扫描单个索引时可以比较类似WHERE a = 5 AND b = 10的子句。 (2认同)