В схеме миграции, какое должно быть значение по умолчанию для поля null = False, которое, я уверен, не будет иметь нулевых значений? - PullRequest
17 голосов
/ 20 июня 2011

Я хочу добавить поле ForeignKey в мою модель. Для этого я сделал 3 шага:

  1. Добавил поле ForeignKey с null=True к моей модели, а затем создал schemamigration.
  2. Создано datamigration для заполнения этого внешнего ключа разумным значением. После применения этой миграции я почти уверен, что в этом поле не осталось объекта со значением NULL.
  3. Изменил это поле ForeignKey на null=False, а затем создал другое schemamigration.

Однако у меня проблемы на шаге 3 :

? The field 'MyModel.fkfield' does not have a default specified, yet is NOT NULL.
? Since you are making this field non-nullable, you MUST specify a default
? value to use for existing rows. Would you like to:
?  1. Quit now, and add a default to the field in models.py
?  2. Specify a one-off value to use for existing columns now
? Please select a choice:

Хорошо ... Никакое значение по умолчанию не имеет смысла для этого поля, и к тому же теперь я почти уверен, что ни у одного объекта нет этого поля как NULL. Итак ... Я не знаю, как правильно ответить на этот вопрос. Если бы я мог, я бы сказал: "Не устанавливайте никакого значения по умолчанию, и выведите ошибку, если вы обнаружите в этом столбце NULL. ».

На данный момент, в качестве обходного пути, чтобы обойти этот вопрос, я выбрал опцию 2, а затем использовал 1 в качестве единовременного значения по умолчанию. Это довольно плохое решение, но по крайней мере south не жалуется на это и создает миграцию.

  • Как правильно изменить поле на NOT NULL? (используя south)
  • Что мне делать, когда south запрашивает значение по умолчанию для поля, в котором его не должно быть?

Я использую django-1.2 и south-0.7.


Смежный вопрос: Джанго Юг - превращение нулевого = истинного поля в нулевое = ложное поле

Сопутствующая документация: Часть 3. Расширенные команды и перенос данных

(сноска: здесь, в StackOverflow, у нас есть два тега, которые мне кажутся одинаковыми: "django-south" и "south", но у меня недостаточно репутации, чтобы предлагать синонимы)

1 Ответ

15 голосов
/ 20 июня 2011

Просто мысль: так как это внешний ключ, вы можете установить значение по умолчанию для записи, которая, как вы знаете, никогда не будет ссылочной записи, то есть 0 или -1.Ваша БД выдаст ошибку, если юг на самом деле попытается использовать это значение по умолчанию.

...