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()
)