Модель 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/ имя.пустой по умолчанию False, что означает, что он должен быть указан.

однако я мог бы успешно создать объект Person следующим образом:

Person.objects.create()

обратите внимание, что имя не указано. Что происходит?

Ok, ответ из документов:

обратите внимание, что это отличается от нулевой. null является чисто связанным с базой данных, тогда как blank связан с проверкой. Если поле имеет значение blank=True,форма проверки позволит ввести пустое значение. Если поле имеет значение blank=False, поле будет обязательным.

еще одна закавыка:

обратите внимание, что валидаторы не будут запускаться автоматически при сохранении модели, но если вы используете ModelForm, он будет запускать валидаторы на любых полях, которые включены в форма.

вы несете ответственность за вызов чистых методов перед сохранением, если вы не используете форму.

2 ответов


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

Django создает пользователя с пустой строкой. Вы можете запустить Person.objects.all() и он даст вам список, если вы сохраните его в переменной с именем user_list и сделать что-то вроде user_list[0], он вернет объект пользователя с пустой строкой. Я не знаю, как и почему он это делает.