Модель 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], оно вернет объект пользователя с пустой строкой. Я не знаю, как и почему он это делает.