Django OneToOneField с db_index = False против OneToOneField - PullRequest
0 голосов
/ 12 декабря 2018

Как я знаю, OneToOneField создаст unique-constraint, а база данных создаст unique-index для внутреннего управления уникальными значениями unique-constraint.

В результате unique-constraint будет эквивалентноunique-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 голосов
/ 12 декабря 2018

OneToOneField подразумевает, что unique=True (как вы явно можете видеть в исходном коде ), а unique=True подразумевает, что db_index=True, как отмечено в документации:

Обратите внимание, что когда unique равен True, вам не нужно указывать db_index, поскольку unique подразумевает создание индекса.

То есть ваш db_index=False молча игнорируется.Можно утверждать, что в этой ситуации следует выдавать предупреждение.

Обратите внимание, что существует принятый билет , разрешающий как unique=True, так и db_index=False в некоторых ситуациях, но это небыть одним из них.

0 голосов
/ 12 декабря 2018

, глядя на исходный код для OneToOneField , он всегда устанавливает ограничение UNIQUE для таблицы.это переопределит (молча, очевидно) любое предпочтение db_index, которое вы могли установить

, если вы хотите, чтобы другие способы увидеть, что происходит, вот несколько вариантов:

  1. Вы можете использовать команду sqlmigrate Django в полученной миграции, чтобы увидеть, что она скажет вашей базе данных сделать
  2. после выполнения миграции, вы можете проверить базу данных напосмотрите, какие ограничения / индексы были установлены
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...