django-rest-framework-01
概念,restful风格
- 为什么要用restful风格的组件进行开发?
主要作用是前后端分离,可以让前端和后端同时进行开发,使用restful一开始只写接口,而不写视图函数,这些接口就是通过restful风格的路由,配合请求方式来对数据库进行增删改查操作,同一个路由不同的请求方式代表了不同的操作。
django-rest-framework框架基本开发流程?
-
1.在settings中配置framework模块。
-
2.编写serializers.py文件,对当前模块的所有表编写序列类以支持增删改操作,如果需要进行查询,则还要对表编写过滤类。如果表之间存在关联,则需要在类中调用其他表的序列类创建一个实例。
-
3.二级路由文件中用router对象注册接口路径,urlpatterns列表中引入router.urls来让这些接口生效。
-
4.编写ViewSet类,非常像视图,这个类创建之前编写的serializer实例,以及指定queryset等关键属性,就可以对对应的表进行增删改查,如果有一些特殊的操作,可以重写其中的六种方法。
list 对应查询操作 GET
create 对应增加记录 POST
update 更新 PUT
partial_update 局部字段更新 PATCH
destroy 删除 DELETE
-
5.这些接口的请求路径就是一级路由拼接router.register(',,,url', views.xxViewSet)这个当中的第一个url参数。
-
备注
总结一下 django restframework 的设计思路。
-
设计 serializer
编写serializers.py文件,对每一个表进行序列化,过滤类的编写。
-
得到 queryset
编写视图的时候,继承viewset,指定queryset,过滤,序列类。
-
序列化后返回
创建序列对象,传入queryset和请求,对数据库进行查询,返回响应。
或者
-
设计 serializer
同样编写每个表的过滤,序列类
-
从 request 中获取数据
编写视图,继承viewset,指定queryset,serializer_class关键变量,对数据库进行增删改查等操作
-
反序列化后保存
满足一定条件则进行serializer.save(),对数据库做出持续性的更改,不满足则返回响应提示错误信息。
环境依赖
- requirement.txt 包含需要的模块
- 使用时进入项目,控制台执行pip install -r requirement.txt
入门笔记
-
1.编写序列类
在模块下新建serializers.py文件,编写如下代码
# 导入我们的模型 from demo.models import Type, User from rest_framework import serializers # 导入filter_set from django_filters.filterset import FilterSet # 序列器,每个model都要写,指定模型类和字段 class TypeSerializers(serializers.HyperlinkedModelSerializer): class Meta: model = Type fields = '__all__' # __all__代表所有字段,如需指定部分字段,可用以下方式 # fields = ('字段一', '字段二', '...') class UserSerializers(serializers.HyperlinkedModelSerializer): # 在models中存在外键关系,此处需要用type来接收 type = TypeSerializers() class Meta: model = User fields = '__all__' # 当需要查询操作时,需要重写filter类,继承FilterSet类 # 同样是重写Meta中model和fields class UserFilter(FilterSet): class Meta: model = User fields = '__all__'
-
2.接口编写(可以写在视图文件里面,但是个人感觉单独来写,视图调用时在进行导入更好)
views.py文件编写接口类,视图函数
# 导入django的json响应类 from django.http import JsonResponse # 导入我们自己写的序列器 from .serializers import UserFilter, UserSerializers, TypeSerializers # 导入模型中的类 from demo.models import User, Type # 导入viewsets from rest_framework import viewsets # 导入FilterBackend from django_filters.rest_framework import DjangoFilterBackend import json # 导入django中处理用户密码的两个函数 from django.contrib.auth.hashers import make_password, check_password # Create your views here. ''' 视图类,继承viewsets.ModelViewSet ''' class TypeViewSet(viewsets.ModelViewSet): queryset = Type.objects.all() serializer_class = TypeSerializers filter_backends = (DjangoFilterBackend,) class IndexViewSet(viewsets.ModelViewSet): # 几个关键变量 queryset = User.objects.all() # 要查询的querset serializer_class = UserSerializers # 表序列器 filter_class = UserFilter # 过滤器 filter_backends = (DjangoFilterBackend,) # 过滤系统,可以传入多个 # 增加记录 def create(self, request, *args, **kwargs): ret_msg = {'status': 2000, 'msg': None} # 返回信息字典 name = request.data.copy().get('name', '') if name == '': print(name) ret_msg['msg'] = '名字不能为空!' return JsonResponse(ret_msg) # 创建序列器实例,传入data,context参数 data = { 'name', name, 'type', 0 } serializer = UserSerializers(data=data, context={'request': request}) # 判断序列器状态,做出对应响应 if not serializer.is_valid(): ret_msg['status'] = 2001 ret_msg['msg'] = serializer.errors return JsonResponse(ret_msg) if ret_msg['msg'] is None: ret_msg['msg'] = '成功!' # 序列器保存执行命令 serializer.save() return JsonResponse(ret_msg)
-
3.路由配置
路由文件编写如下形式
from django.urls import path,include # 导入routers包 from rest_framework import routers from .views import IndexViewSet, TypeViewSet # 实例一个router router = routers.DefaultRouter() # 注册表 router.register(r'type', viewset=TypeViewSet, base_name='type') router.register(r'user', viewset=IndexViewSet, base_name='user') urlpatterns = [ path('^', include(router.urls)) ]
-
4.其他配置
settings.py文件
# restframework 配置 REST_FRAMEWORK = { # Use Django's standard `django.contrib.auth` permissions, # or allow read-only access for unauthenticated users. 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' ] } INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'demo', ]
评论 2
这个网站的富文本编辑器还有待加强, 现在还不怎么好用
用的Markdown编辑器
感谢分享!