Django CheckConstraint не обеспечивает проверку поля модели

Я использую Django 3.2.

База данных бэкенда, используемая для тестирования: sqlite3

У меня есть модель Foo:

class Foo(models.Model):
    # some fields ...
    some_count = models.IntegerField()

    class Meta:
        models.constraints = [
            models.CheckConstraint(
                check = ~models.Q(some_count=0), 
                name = 'check_some_count',
            ),
        ]            

  

У меня также есть модульный тест следующего содержания:

def test_Foo_some_count_field_zero_value(self):
    # Wrap up the db error in a transaction, so it doesn't get percolated up the stack
    with transaction.atomic():
        with self.assertRaises(IntegrityError) as context:
            baker.make(Foo, some_count=0)

При запуске моих модульных тестов происходит сбой в приведенном выше тесте с сообщением об ошибке:

    baker.make(Foo, some_count=0)
AssertionError: IntegrityError not raised

Затем я изменил приведенный выше атрибут CheckConstraint на:

    class Meta:
        models.constraints = [
            models.CheckConstraint(
                check = models.Q(some_count__lt=0) | models.Q(some_count__gt=0), 
                name = 'check_some_count',
            ),
        ]   

Тест все равно не прошел, с тем же сообщением об ошибке. Затем я попробовал следующее, чтобы проверить, выполняются ли ограничения вообще:

def test_Foo_some_count_field_zero_value(self):
    foo = baker.make(Foo, some_count=0)
    self.assertEqual(foo.some_count, 0)

К моему полному ужасу, тест прошел - ясно показывая, что проверка ограничений была проигнорирована. Я проверил в Интернете, не является ли это известной проблемой sqlite3, но пока ничего не обнаружил - так почему же проверка ограничений игнорируется - и как это исправить (не переопределяя models.Model.clean() )

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