Django не выбрасывает ошибку ValidationError при отсутствии обязательных полей

В настоящее время я тестирую свою модель django с помощью pytest (и pytest-django), но я не могу написать неудачный тест, в котором отсутствует обязательное поле.

Моя Person-модель требует только name и company. Остальные поля являются обнуляемыми и поэтому необязательными.

models.py:

from django.db import models


# Create your models here.
class Person(models.Model):
    name = models.CharField(max_length=64)
    company = models.CharField(max_length=128)
    position = models.CharField(max_length=64, null=True, blank=True)
    date_of_birth = models.DateField(null=True, blank=True)

    def __str__(self):
        return (f"{self.name}"
                + (f", {self.position}" if self.position is not None else "")
                + f"({self.company})"
                + (f" born {self.date_of_birth}" if self.date_of_birth is not None else "")
                )

test.py

from .models import Person
import pytest
from django.core.exceptions import ValidationError

pytestmark = pytest.mark.django_db


# Create your tests here.
def test_minimal_person():
    """Test if a minimal person can be created"""
    valid_person = Person(name="Max Mustermann", company="ACME")
    valid_person.save()

    assert len(Person.objects.get_queryset()) == 1


def test_insufficient_params():
    with pytest.raises(ValidationError):
        invalid_person = Person()
        invalid_person.save()


def test_missing_company():
    with pytest.raises(ValidationError):
        invalid_person = Person(name="Max")
        invalid_person.save()


def test_missing_name():
    with pytest.raises(ValidationError):
        invalid_person = Person(company="ACME")
        invalid_person.save()


def test_invalid_date_format():
    """Test if an invalid date format throws a ValidationError"""
    with pytest.raises(ValidationError):
        invalid_person = Person(name="Max", company="ACME", date_of_birth="not-a-date")
        invalid_person.save()

Тесты test_invalid_date_format и test_minimal_person успешны, но другие не выбрасывают (ожидаемую) ошибку.

Что я здесь упускаю?

Метод save() не делает никакой проверки для ваших полей, потому что они могут попасть в базу данных, когда пусты. См. Что происходит при сохранении? Причина, по которой недопустимая дата выбрасывает ошибку ValidationError, заключается в том, что это не дата. Однако пустая строка все равно является строкой и может быть сохранена в базе данных как таковая. Для принудительной валидации вызовите метод full_clean() объекта модели.

Вернуться на верх