可以说我有一个定义如下的模型:
class Foo(models.Model):
bar = models.CharField(max_length=10)
使用此模型,我使用以下代码在数据库中创建一个Foo
对象:
Foo.objects.create(bar="0123456789")
应该足够好。但是,在创建对象之后,我将max_length
属性减小为5。因此,从技术上来讲,现在,我创建的对象存在一致性错误。
Django如何处理这种情况?我假设在再次保存该对象之前,它们不会引发任何错误。如果是这样,那是否是针对这种情况的最佳解决方案,还有其他方法吗?
答案 0 :(得分:3)
在您描述的情况下,Django将不执行任何操作。但是,如果运行makemigrations
,它将生成数据库迁移,该迁移会将db列修改为5个字符。运行此命令将截断现有值。
答案 1 :(得分:1)
这取决于特定的字段属性。对于max_length
,除了数据库本身,它还用于其他几个验证步骤。
默认的html小部件将在maxlength
表单元素中插入<input>
属性。在服务器端,Form.clean()
还将检查任何char字段的长度。
最后,数据库将引发错误(如果您在更改字段之后创建并应用了新的迁移)。但是这里的具体行为取决于数据库后端。
客户端验证只是可用性功能。来自客户端的所有数据也必须在服务器上进行验证,因为攻击者可以绕过客户端验证,或者某些客户端将客户端验证关闭或不可用。
大多数时间都使用Django的验证。如果您使用django表单,django admin或django rest框架等框架/应用程序,它将内置错误处理和http响应。
当您插入一些无效数据时,即使“不可能”,数据库验证也会回退。此处的错误可能会导致未捕获的异常,并且整个事务都会回滚。当django应用程序中存在错误时,这是一个非常有用的安全网。