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



假设我有一个定义如下的模型:

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

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

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

应该足够好。但是,在创建对象之后,我将max_length属性减少为5。所以现在,从技术上讲,我创建的对象有一个一致性错误。

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

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

它取决于特定的字段属性。在max_length的情况下,除了数据库本身之外,它还用于几个验证步骤。

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

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

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

Django的验证是您大多数时候使用的。如果您使用诸如django-forms、django-admin或django-rest框架之类的框架/应用程序,它会内置错误处理和http响应。

当您插入一些无效数据时,即使"不可能",数据库验证也会回退。这里的错误可能会导致未捕获的异常,并且整个事务将被回滚。当django应用程序中出现错误时,它是一个非常有用的安全网。

最新更新