具有db_index = False的Django OneToOneField与OneToOneField

时间:2018-12-12 15:59:34

标签: python django python-3.x

据我所知OneToOneField将创建一个unique-constraint,数据库将创建unique-index来在内部管理unique-constraint的唯一值。

结果,unique-constraintunique-index等效。 (因为两者都有一个unique-index表)

如果models.OneToOneField('one_to_one', db_index=False)怎么办?

OneToOneField需要unique-index来管理unique-constraint,但是它告诉您不要创建db_index

对我来说似乎很奇怪,但是没有语法错误。

它如何工作?

models.OneToOneField('one_to_one', db_index=False)models.OneToOneField('one_to_one')之间有什么区别?

2 个答案:

答案 0 :(得分:2)

如文档中所述,

OneToOneField表示unique=True(如您在source code中明确看到的),而unique=True表示db_index=True

  

请注意,当uniqueTrue时,您无需指定db_index,因为unique意味着创建了索引。

因此,您的db_index=False被静默忽略。有人可能会争辩说,在这种情况下应该提出警告。

请注意,在某些情况下有accepted ticket允许unique=Truedb_index=False,但这不是其中之一。

答案 1 :(得分:1)

看着source code for OneToOneField,它将始终在表上设置UNIQUE约束。这会(显然是无声地)覆盖您可能设置的任何db_index首选项

如果您想通过其他方式查看正在发生的情况,可以使用以下两种选择:

  1. 您可以在结果迁移中使用sqlmigrate Django command来查看它会告诉数据库做什么
  2. 执行迁移后,您可以检查数据库以查看设置了哪些约束/索引