При добавлении BooleanField в модель django это поле для существующих элементов должно быть True, для новых элементов - False - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь добавить флажок настройки в модель Django, по этой причине я добавляю BooleanField к одной из существующих моделей django, это логическое поле должно быть True для всех существующих строк в базе данных, однако поле должно быть False для новых созданных строк.

class FlagSetting(models.Model):
   name = models.CharField(max_length=10)
   flag = models.BooleanField(default=False)# by setting default to 'False' disabled the flag for the existing entries as well

Любая помощь с этим приветствуется. Какое-нибудь отношение к переопределению метода save()?

РЕДАКТИРОВАТЬ Я ищу решение, которое учитывает автоматизированное развертывание производства. Спасибо вам всем за помощь

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Добавьте поле с default=True и выполните makemigrations, чтобы создать миграцию.Затем переключите значение по умолчанию на False и снова запустите makemigrations.

Затем запустите migrate, чтобы запустить обе миграции.Когда начнется первая миграция, Django добавит столбец и установит для всех существующих записей значение True.Вторая миграция не изменит значения для существующих строк.

При таком подходе, я думаю, вы получите небольшое окно между запуском миграций и перезапуском вашего веб-сервера, где создается новая строка через веб-сайт.приведет к «не нулевое ограничение не удалось».Если это неприемлемо, вы можете создать поле с помощью null=True, запустить миграцию, затем удалить null=True и выполнить окончательную миграцию данных, чтобы изменить любые значения NULL на True или False, как требуется.

0 голосов
/ 11 марта 2019

Ну, есть много вариантов, как справиться с этой ситуацией.Можно было бы сначала просто добавить поле без значения по умолчанию и попросить Django создать соответствующую миграцию.Таким образом, ваша модель должна выглядеть следующим образом:

class FlagSetting(models.Model):
    name = models.CharField(max_length=10)
    flag = models.BooleanField()

Когда вы запускаете команду manage.py makemigrations Django спросит, что делать, вы можете указать «одноразовое значение по умолчанию».Это значение будет использоваться для заполнения существующих экземпляров.Сделав это, код миграции, сгенерированный Django, установит предоставленное вами разовое значение по умолчанию для всех ранее существующих экземпляров.

После этого вам следует снова изменить модель, чтобы установить желаемое значение по умолчанию для вашего поля, чтобы вашмодель выглядит так:

class FlagSetting(models.Model):
    name = models.CharField(max_length=10)
    flag = models.BooleanField(default=False)

И тогда вам нужно снова запустить manage.py makemigrations.На этот раз будет создана новая миграция для установки значения по умолчанию False.Тогда каждый вновь созданный экземпляр будет иметь flag=False по умолчанию.

...