Django 1.7 пустое соглашение CharField/TextField

Допустим, используя новую среду миграции Django, у меня есть следующая модель, которая уже существует в базе данных:

class TestModel(models.Model):
    field_1 = models.CharField(max_length=20)

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

class TestModel(models.Model):
    field_1 = models.CharField(max_length=20)
    field_2 = models.TextField(blank=True)

Когда я пытаюсь перенести эту модель с помощью python manage.py makemigrations, я получаю следующее приглашение:

You are trying to add a non-nullable field 'field_2' to testmodel without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows)
 2) Quit, and let me add a default in models.py

Я могу легко исправить это, добавив null=True к field_2, но соглашение Django состоит в том, чтобы избегать использования null в строковых полях, таких как CharField и TextField (из https://docs.djangoproject.com/en/dev/ref/models/fields/). Это ошибка, или я неправильно понимаю документы?


person Jeremy Swinarton    schedule 03.11.2014    source источник


Ответы (2)


Это не ошибка, это задокументировано и логично. Вы добавляете новое поле, которое (как вы заметили, согласно передовой практике) не NULLable, поэтому django должен что-то добавить в него для существующих записей - я думаю, вы хотите, чтобы это была пустая строка.

Вы можете

 1) Provide a one-off default now (will be set on all existing rows)

поэтому просто нажмите 1 и укажите '' (пустая строка) в качестве значения.

или укажите default='' в models.py, как было предложено:

 2) Quit, and let me add a default in models.py
person ch3ka    schedule 03.11.2014
comment
Думаю, в этом есть смысл, но мне это кажется странным поведением. Я ожидаю, что если я укажу blank=True, миграция будет автоматически использовать пустую строку по умолчанию, точно так же, как если я укажу null=True, мне не нужно указывать миграции использовать NULL по умолчанию. - person Jeremy Swinarton; 03.11.2014
comment
Ну, explicit is better than implicit. blank=True только говорит администратору django принять пустую строку в качестве ввода, это не подразумевает значение по умолчанию. default= делает, и вполне разумно указать значение по умолчанию, отличное от пустой строки. Для null=True миграция не использует NULL по умолчанию, а просто ничего не использует, что приводит к оценке NULL. - person ch3ka; 03.11.2014

  1. выберите 1, он перейдет к терминалу Python.
  2. Дайте timezone.now(), он выйдет из терминала Python.

Примечание: он может не выйти из терминала в первый раз, дайте эту команду еще раз.

person satya narayan pardhi    schedule 16.05.2019