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

时间:2015-09-29 00:58:58

标签: python django serialization django-models django-rest-framework

Django Rest Framework序列化程序在验证模型序列化程序时不会调用Model.clean。给出的解释是,这导致“更清晰地分离关注点”,from the Django Rest Framework 3.0 release notes

  

ModelSerializer验证与ModelForm之间的差异。

     

此更改还意味着我们不再使用.full_clean()方法   在模型实例上,而是显式执行所有验证   序列化器。这样可以实现更清晰的分离,并确保这一点   ModelSerializer类没有自动验证行为   在常规的Serializer类中也不能轻易复制。

但Django Rest Framework的作者尝试分离有什么关注点?

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

1 个答案:

答案 0 :(得分:12)

模型的“full_clean”有两个主要问题。 第一个是技术性的。有几种情况下full_clean根本就没有调用。例如,当你执行queryset.update()时,你将绕过它。

第二个问题是,如果你有一个复杂的业务逻辑 - 这通常是你有一个full_clean的原因 - 你可能应该在业务逻辑中进行验证,而不是去模型验证。 每一层都应该负责自己的一致性,而存储层 - 即模型 - 不应该关心业务层。

我能想到的另一件事是,一旦你有一个模型,在序列化程序进行验证之后,将调用full_clean。在这一点上,事情开始变得混乱,因为你有一个两步验证,其间有一个对象创建。 如果您正在使用嵌套的序列化程序,您可能会被困在这里,因为在保存主模型之前您将无法创建嵌套模型,这将使​​完全干净的调用更加混乱 - 某些对象将被创建,其他将不会。很难弄清楚什么时候和什么对象应该用他们的full_clean进行验证,你可以肯定当用户覆盖更新/清理时会有很多抱怨,并且发现没有调用full_clean每个型号。 这开始变得令人头痛,我们更愿意让事情更简单,更明确。