Как проверить, не приведет ли непредоставление значения для определенного поля при создании экземпляра модели к ошибке?

from django.contrib.auth.models import User

>>> User._meta.get_field("username").null
False

Но

>>> user()
<User: >

Что? Я ожидал IntegrityError, потому что значение null нельзя хранить в базе данных с null=False.

Затем я прочитал это:

Django никогда не хранит NULL для пустых типов CharField или TextField. Он хранит пустую строку (''). Вот почему вы не получаете IntegrityError для null = False.

О, хорошо, это должно означать, что пустая строка определена как значение по умолчанию, верно?

User._meta.get_field("имя пользователя").default django.db.models.fields.NOT_PROVIDED

Какая? Я ожидал пустую строку... .

Тогда как вы должны проверять (например, для использования в тестах, с assertEquals/assertRaise/...), если не предоставление значения для определенного поля (например, username) при создании экземпляра модели (например, User) вызовет исключение ?

Редактировать

Я хотел бы знать, как кто-нибудь напишет модульный тест, чтобы проверить это. (Если бы assertNotRaises существовало, было бы проще).


person Bentley4    schedule 12.12.2013    source источник


Ответы (1)


Вы можете использовать full_clean метод.

>>> User().full_clean()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/falsetru/.virtualenvs/django16/local/lib/python2.7/site-packages/django/db/models/base.py", line 950, in full_clean
    raise ValidationError(errors)
ValidationError: {'username': [u'This field cannot be blank.'], 'password': [u'This field cannot be blank.']}
person falsetru    schedule 12.12.2013
comment
Вы проверяете, возникают ли ошибки ValidationErrors, то есть если User._meta.get_field("username").blank равно False. Однако я спрашиваю, является ли User._meta.get_field("username").null False. - person Bentley4; 12.12.2013