2

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

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

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

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

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

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

4

2 回答 2

3

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

于 2018-11-10T18:06:00.740 回答
1

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

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

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

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

Django 的验证是您最常使用的。如果您使用框架/应用程序(例如 django forms、django admin 或 django rest 框架),它会内置错误处理和 http 响应。

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

于 2018-11-10T18:06:25.940 回答