当前位置: 首页 > 知识库问答 >
问题:

为什么Django Rest Framework不鼓励模型级验证?

蒋默
2023-03-14

Django Rest框架序列化程序不调用模型。验证模型序列化程序时清除。给出的解释是,这导致了Django Rest Framework 3.0发行说明中的“更清晰的关注点分离”:

此更改还意味着我们不再使用。对模型实例执行full_clean()方法,但在序列化程序上显式执行所有验证。这提供了更清晰的分离,并确保ModelSerializer类上没有自动验证行为,而这些行为也不能轻松地复制到常规序列化程序类上。

但是DjangoRest框架的作者试图分离哪些问题呢?

我的猜测是,他们说模型实例不应该关心它自身的有效性。如果是这样的话,我不明白为什么。

共有1个答案

邬浩涆
2023-03-14

模型的“完全清洁”有两个主要问题。第一个是技术性的。在一些情况下,完全清洁根本不需要。例如,当您执行查询集时,您将绕过它。更新()

第二个问题是,如果您有一个复杂的业务逻辑——这通常是您进行全面清理的原因——那么您可能应该在业务逻辑中进行验证,而不是深入到模型中进行验证。每一层都应负责其自身的一致性,而存储层(即模型)不应关心业务层。

我能想到的另一件事是,一旦你有了序列化程序进行验证后的模型,就会调用full_clean。此时,事情开始变得混乱,因为您有一个两步验证,其间创建了一个对象。

如果您使用的是嵌套序列化程序,您可能会被困在这里,因为在保存主模型之前,您将无法创建嵌套模型,这将使完全清除调用更加混乱-一些对象将被创建,而另一些则不会。很难弄清楚什么时候以及什么对象应该用他们的“完全清理”进行验证,你可以肯定,当用户覆盖更新/清理并弄清楚没有为每个模型调用“完全清理”时,会有很多用户抱怨。这开始成为一个令人头痛的问题,我们更喜欢让事情变得简单和明确。

 类似资料:
  • 问题内容: Model.clean验证模型序列化器时,Django Rest Framework序列化器不会调用。给出的解释是,这导致了Django Rest Framework 3.0发行说明中的 “更清晰的关注点分离” : ModelSerializer验证和ModelForm之间的差异。 此更改还意味着我们不再.full_clean()在模型实例上使用该方法,而是在序列化程序上显式执行所有验

  • 大多数在线来源都表明您可以静态链接glibc,但不鼓励这样做;例如centos包repo: glibc静态包包含用于静态链接的C库静态库。你不需要这些,除非你静态链接,这是非常不鼓励的。 这些消息来源很少(或从未)说明为什么这是个坏主意。

  • 问题内容: 这是来自Hibernate的官方教程: 还有一个替代声明,该声明允许使用组合键访问旧数据。强烈建议不要将其用于其他任何用途。 为什么不鼓励使用复合键?我正在考虑使用一个三列表,其中所有列都是外键,并且一起形成一个主键,这在我的模型中是有意义的关系。我不明白为什么这是一个坏主意,特别是我将在它们上使用索引。 有什么选择?创建一个额外的自动生成的列并将其用作主键?无论如何,我仍然需要查询我

  • 问题内容: 关于Java EE开发的第一件事是,我不应该在Java EE容器中生成自己的线程。但是当我考虑它时,我不知道原因。 您能清楚地解释为什么不鼓励这样做吗? 我确信大多数企业应用程序都需要某种异步作业,例如邮件守护程序,空闲会话,清理作业等。 因此,如果确实不应该产生线程,那么在需要时正确的方法是什么? 问题答案: 不建议这样做,因为环境中的所有资源都应由服务器进行管理,并可能由服务器进行

  • 问题内容: 这取自Airbnb react样式指南。有人可以解释为什么“不鼓励依赖函数名推断”吗?只是样式问题吗? 问题答案: 我认为这也可能与您可能会遇到的意外行为有关,从隐式地将词法名称赋予您可能希望使用的匿名函数可能会遇到这种意外行为。 例如说有人理解了箭头功能: 要使常规功能等效: 期望这段代码非常容易: 然后等于: 该函数仍然是匿名的,无法引用自身来执行诸如递归的操作。 因此,如果那时,