sqlite Django CheckConstraint不强制检查模型字段

kupeojn6  于 2023-06-06  发布在  SQLite
关注(0)|答案(1)|浏览(162)

我用的是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())?

smdncfj3

smdncfj31#

也许你应该试试constraints而不是models.constraints

class Meta:
        constraints = [
            ...
        ]

相关问题