Модель Django blank = False не работает?
У меня есть следующая модель в Django 1.5:
class Person(models.Model):
name = models.CharField(max_length=50)
Обратите внимание, что согласно https://docs.djangoproject.com/en/dev/ref/models/fields/
name.blank по умолчанию False, что означает, что он должен быть указан.
Однако я мог бы успешно создать объект Person следующим образом:
Person.objects.create()
Обратите внимание, что имя не указано. Что происходит?
Хорошо, ответ из документов:
Обратите внимание, что это отличается от нуля. null - это чисто связанный с базой данных, в то время как пустой - связанный с проверкой. Если поле имеет пустое value = True, проверка формы позволит ввести пустое значение. Если поле имеет пустое value = False, поле будет необходимо.
Другой улов:
Обратите внимание, что валидаторы не будут запускаться автоматически при сохранении модели, но если вы используете ModelForm, он будет запускать ваши валидаторы в любых полях, которые включены в вашу форму.
Это ваша ответственность за вызов чистых методов перед сохранением, если вы не используете форму.
Ответы
Ответ 1
blank
применяется только к проверке поля формы, как в формах admin, django и т.д.
null
, с другой стороны, это столбец с нулевым уровнем базы данных.
Что касается пустых результатов по умолчанию ''
, я действительно просто принял его как "тот, который работает", но здесь, где он находится в django.db.models.Field
def get_default(self):
"""
Returns the default value for this field.
"""
if self.has_default():
if callable(self.default):
return self.default()
return force_unicode(self.default, strings_only=True)
if (not self.empty_strings_allowed or (self.null and
not connection.features.interprets_empty_strings_as_nulls)):
return None
return ""
# ^ this
Ответ 2
Django создает пользователя с пустой строкой. Вы можете запустить Person.objects.all()
, и он предоставит вам список, если вы сохраните его под переменной user_list
и сделаете что-то вроде user_list[0]
, оно вернет объект пользователя с пустой строкой. Я не знаю, как и почему он это делает.