方案理论基础
在Web开发中对于数据模型的操作不可避免,常见的数据资源的对象一般有两种:
- 对某一数据资源集合的操作
- 对某一数据资源对象的的操作
对于数据资源操作及其前端HTTP请求方法通常有:
增
—->POST
orPUT
删
—->DELETE
改
—->POST
orPUT
查
—->POST
orGET
而业界RESTful API
设计风格的对资源的操作类型和HTTP动词关系设计通常采用如下方案:
增
—->POST
(在服务器新建资源)删
—->DELETE
(从服务器删除资源)改
—->PUT
(在服务器更新资源,客户端提供资源改变属性)查
—->GET
(从服务器获去资源)改
—->PATCH
(在服务器更新资源,服务器提供资源改变属性)
利用上述原理和django-restFramework
的序列化器serialiaer
我们设计一种适用于django
框架项目的通用型增删改查方案。
项目架构
1 | project--- |
实现方案
1 | #views.py |
1 | # serializers.py |
请求封装
首先在前端请求的headers中添加我们需要获取的资源类名
1 | import requests |
为了防止django
拦截headers中的参数,我们需要在settings
文件中配置request
跨域的允许访问的headers
字段
1 | CORS_ALLOW_HEADERS = ( |
解析并获取资源类
前台请求制定资源对象类名和请求HTTP动词即可通过反射定位到对应方法,完成对资源的相关操作
1 | # app 下的model文件 |
动态构建资源对象的查询条件
通常我们对资源查询对于像id
、pk
、fk
等索引性条件采用field__in=list_obj
或者field=int_obj
,对于其他字段通常采用field__icontains=obj
的模糊匹配的方法,进行条件查询,利用这些特性,我们使用Q
查询动态构建查询条件。
为了让改方法适用于所有的模型,我们讲查询条件定义到 `model.py`中的资源对象类中静态方法
1 | class UserDetail(models.Model): |
至此我们基本完成了jango项目通用型增删改查的方案,所有跟资源模型相关在model
文件中定义,如果要使用django-restframwork
序列化方法的相关则在serializers.py
中定义,对资源模型的操作在views
文件中定义,当然你完全可以重新定义当多个APP使用同一个model_list()
和model_detail()
方法,也可以不采用django-restframwork