我知道这是一个广泛的问题。但是,假设您有一个 Django 项目,其中包含移动应用程序客户端使用的 API。
可以在许多位置添加验证逻辑:
- 模型字段本身
- 模型,通过重写
save()
方法 - Django 表单和模型表单。 API 序列化程序
- (通用序列化程序或模型序列化程序(
在构建项目时,哪些规则/元素可帮助您选择是将验证放在这里还是放在那里?
这是一个观点和风格问题。我认为模型验证是绝对的要求,是防止错误的最后一道防线。模型验证到位后,您可以继续使用面向验证的表单、客户端和 API。
特定的模型验证、字段或模型方法(或自定义管理器等(是样式的选择,以及适用于特定应用的内容,但保留模型验证。这是一个捕捉一切的地方。您可能有许多表单,许多 API,但有一个点是数据进入数据库。
django 的一个优点是,在许多情况下,模型验证会传播,例如 ModelForms。所以这也是一种便利,但这是一个很好的选择:模型验证本质上是通往数据库的最后一扇门,应该得到适当的处理。
旁注:"字段"验证实际上是"数据库验证"和"django 字段验证"。
为了尽可能遵守 DRY 原则:
使用通用验证器的 django 方法。因此,即使您在多个位置进行验证,也使用相同的验证。如果此验证发生更改,则会在所有位置更改,请参阅 https://docs.djangoproject.com/en/1.9/ref/validators/
如果可能,所有面向客户端的对象都应拉取模型验证并使用它们,或将它们映射到正确的客户端验证,类似于 ModelForms。
如果可能,请使用模型验证错误消息向客户端创建有意义的反馈。
但验证毕竟可能会重复步骤,主要是因为验证(至少(有两个角色:清理数据和向用户提供反馈。最好的例子是客户端验证。提供即时反馈很有用,无需往返服务器,但它会重复服务器端验证。模型验证只是确保当您添加更多表单、API、选项时,如果您忘记实现正确的验证 - 模型将阻止它。