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

Rol*_*llo 30 python django serialization django-models django-rest-framework

Django Rest Framework序列化程序不会调用Model.clean何时验证模型序列化程序.给出的解释是,这可以从Django Rest Framework 3.0发行说明中获得"更清晰的关注点分离" :

ModelSerializer验证和ModelForm之间的差异.

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

但是,什么样的关注是Django的REST框架的尝试分开的作者?


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

Lin*_*via 16

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

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

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

  • 你能更明确地解释这部分吗?"第二个问题是,如果你有一个复杂的业务逻辑[...],你可能应该在业务逻辑中进行验证,而不是去模型验证." 该业务逻辑将存在于何处并从中调用?你的意思是Serializer在验证期间应该调用一些业务逻辑吗?似乎有关于这个主题的[很多意见](http://programmers.stackexchange.com/questions/250035/where-exactly-should-python-business-logic-be-placed-in-django)并且它是非直观的新Django/DRF用户. (2认同)