Django如何保持逻辑约束和数据库之间的一致性?

时间:2018-11-10 17:39:40

标签: django database django-database

可以说我有一个定义如下的模型:

class Foo(models.Model):
    bar = models.CharField(max_length=10)

使用此模型,我使用以下代码在数据库中创建一个Foo对象:

Foo.objects.create(bar="0123456789")

应该足够好。但是,在创建对象之后,我将max_length属性减小为5。因此,从技术上来讲,现在,我创建的对象存在一致性错误。

Django如何处理这种情况?我假设在再次保存该对象之前,它们不会引发任何错误。如果是这样,那是否是针对这种情况的最佳解决方案,还有其他方法吗?

2 个答案:

答案 0 :(得分:3)

在您描述的情况下,Django将不执行任何操作。但是,如果运行makemigrations,它将生成数据库迁移,该迁移会将db列修改为5个字符。运行此命令将截断现有值。

答案 1 :(得分:1)

这取决于特定的字段属性。对于max_length,除了数据库本身,它还用于其他几个验证步骤。

默认的html小部件将在maxlength表单元素中插入<input>属性。在服务器端,Form.clean()还将检查任何char字段的长度。

最后,数据库将引发错误(如果您在更改字段之后创建并应用了新的迁移)。但是这里的具体行为取决于数据库后端。

客户端验证只是可用性功能。来自客户端的所有数据也必须在服务器上进行验证,因为攻击者可以绕过客户端验证,或者某些客户端将客户端验证关闭或不可用。

大多数时间都使用Django的验证。如果您使用django表单,django admin或django rest框架等框架/应用程序,它将内置错误处理和http响应。

当您插入一些无效数据时,即使“不可能”,数据库验证也会回退。此处的错误可能会导致未捕获的异常,并且整个事务都会回滚。当django应用程序中存在错误时,这是​​一个非常有用的安全网。