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

How does Django maintain consistency between its logical constraints, and its database?

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

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

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

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

应该工作得很好。但是,在创建对象之后,我将 max_length 属性 减少到 5。所以现在,从技术上讲,我创建的对象存在一致性错误。

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

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

这取决于具体领域属性。在 max_length 的情况下,除了数据库本身之外,它还用于几个验证步骤。

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

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

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

Django 的校验是你用的最多的。如果您使用 framework/app(例如 django 表单、django 管理或 django rest 框架),它会内置错误处理和 http 响应。

当您插入一些无效数据时,数据库验证会回退,即使它是 "not supposed to be possible"。此处的错误可能会导致未捕获的异常,并且整个事务将被回滚。当您的 Django 应用程序中存在错误时,这是​​一个非常有用的安全网。