【问题标题】:How does Django maintain consistency between its logical constraints, and its database?Django 如何保持其逻辑约束和数据库之间的一致性?
【发布时间】:2019-04-13 23:09:21
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: django database django-database


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-08-28
        • 1970-01-01
        • 1970-01-01
        • 2014-09-23
        • 2014-02-21
        • 2018-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多