Непонятное поведение Джанго на пропущенных значениях при инициализации модели - PullRequest
0 голосов
/ 16 октября 2018

У меня есть база данных postgres и модель с пустым полем = False и null = True.Скажем так:

class MyModel(models.Model):
    param1 = models.CharField(max_length=1024)
    param2 = models.CharField(max_length=1024)
    info = models.CharField(max_length=1024, blank=False, null=False) 

Теперь, когда я создаю модель, подобную этой:

m = MyModel(param1=val1, param2=val2)

, это в принципе не вызовет никаких исключений для поля info при сохранении.Более того, после использования метода save он сохранит пустое значение для info в базе данных.

ОБНОВЛЕНО
При создании экземпляра модели, подобной этой:
m = MyModel(param1=val1, param2=val2, info=None)
сохранение вызовет исключение в этом случае

Любые предложения, почему этоэто произошло?По моему мнению, если я пропущу добавление значения в инициализацию модели, его следует по крайней мере принять за None, но это не так.Я гуглил это и не мог найти конкретного ответа на это.Но обнаружил, что только метод full_clean() модели выполняет проверку и вызывает исключения, подобные этим:

ValidationError: {'info': ['This field cannot be blank.'], 'owner': ['This field cannot be blank.']}

Любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Итак, после исследования я пришел к следующему ответу:
Прежде всего, blank означает только проверку формы, а null - проверку БД ( документы ).Кроме того, Django всегда принимает пустое значение для отсутствующего параметра, но с немного другим поведением для этих типов полей.

Ключевое различие заключается в том, что для:

  • Поля Char - используется пустая строка (''), реализация Django по умолчанию.Поэтому, если Django обнаружит, что отсутствует параметр, он не передаст None для этого типа поля, поскольку NULL не рекомендуется хранить в БД для полей типа char.( подробности здесь )

  • Другие поля - используется пустое значение (которое составляет None).Таким образом, Django видит, что отсутствует параметр, он будет считать, что это None.Но поскольку ограничение базы данных null = False, это вызовет исключение.

Таким образом, вывод заключается в том, что только не-char-поля, которые должны использовать ограничение базы данных null=False - проверяются на методе save на наличие пропущенных параметров путем вызова исключений.

Теперь, если вы хотите поднять исключения и для Charfields, вам нужно использовать full_clean (используется формами), который сообщит вам, какой тип поля не может быть пустым (или отсутствующим).Таким образом, в итоге, правильный способ - использовать blank=False, а затем full_clean, чтобы обнаружить пропущенные Charfields.Или / И вы можете переопределить метод модели clean(), если к этим полям добавлена ​​дополнительная логика.

0 голосов
/ 16 октября 2018
info = models.CharField('Facts and features', max_length=1024)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...