Django ORM, CharField и blank = True - PullRequest
       0

Django ORM, CharField и blank = True

12 голосов
/ 18 августа 2011

В документации Django совершенно ясно о хранении пустых строк как "", а не как NULL на уровне базы данных (поэтому существует только один возможный формат для пустых данных):

Обратите внимание, что значения пустых строк будутвсегда хранятся как пустые строки, а не как NULL.Используйте только null = True для нестроковых полей, таких как целые числа, логические значения и даты.Для обоих типов полей вам также нужно будет установить blank = True, если вы хотите разрешить пустые значения в формах, поскольку нулевой параметр влияет только на хранилище базы данных (см. Пустое).

Тем не менее, послеДобавляя новое поле, я начал сталкиваться с IntegrityErrors в новом поле (phone_number).

нулевое значение в столбце "phone_number" нарушает ненулевое ограничение

ТоМодель выглядит следующим образом с новым полем (я выполнил миграцию через юг):

class Person(models.Model):
    user = models.ForeignKey(User)
    description = models.TextField(blank=True)
    phone_number = models.CharField(blank=True)

С тех пор (временно) я решил проблему, установив null = True для phone_number, но теперь у меня есть сотнизаписи с пустыми строками и одним значением NULL в моей базе данных.(Я также пытался добавить default = '' в поле phone_number, но я все еще видел проблемы IntegrityError.)

Раньше я всегда использовал MySQL, но в этом проекте я использую Postgres.Сгенерированная попытка вставки SQL:

'INSERT INTO "people_person" ("user_id", "description", "gender", "birthdate", "default_image_id", "zip_code", "beta_status") VALUES (%s, %s, %s, %s, %s, %s, %s) RETURNING "people_person"."id"'.

Я ожидаю, что Django вставит пустую строку в столбец phone_number, но, похоже, это не так.делать это.Другой вещью, которую я мог бы ожидать, было бы включение Django SET DEFAULT в оператор CREATE TABLE, но это не так.Так что Postgres злится из-за NOT NULL в этом столбце.

Спасибо!

Ответы [ 2 ]

7 голосов
/ 21 августа 2011

Как обычно бывает с проблемами, которые кажутся неразрешимыми, под рукой была ошибка пользователя.

У моего приложения было две точки входа - два файла WSGI, но только одна база кода.Обычно Apache перезагружает ваш код только при касании файла.Мой сценарий развертывания касался только одного из этих файлов WSGI - это означало, что люди, заходящие на мой сайт через другой файл WSGI, все еще видели старый код.Хуже того, база данных была изменена в соответствии с этим старым кодом, но модели остались такими же, как и раньше.

Это, в свою очередь, вызвало проблемы IntegrityError.Django не знал о поле phone_number, поэтому, хотя я установил blank=True, Django не приложил усилий для вставки пустого значения - и база данных, конечно, думала, что это означает NULL.

Это вызвалоряд различных для отслеживания ошибок, включая вышеуказанную ошибку.

Удивительно, как часто действительно сложные проблемы, подобные этим, вызваны глупыми незначительными упущениями - как сценарий развертывания, который я написал 2 месяца назад и забыл обновить.

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

6 голосов
/ 24 сентября 2012

Я обнаружил, что если вы явно установите значение поля None, вы все равно получите эти ошибки. Другими словами, вещь default= применяется, как только вы создаете объект python, а не при сохранении его в базе данных.

Полагаю, это разумно, но немного неожиданно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...