我用的是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()
)?
1条答案
按热度按时间smdncfj31#
也许你应该试试
constraints
而不是models.constraints