第七章RESTFramework(DRF)进阶篇GenericAPIview-ViewSet-ModelviewSet类的用法

1.0认识 GenericAPIview类

在这里插入图片描述

1.0 定义数据模型
2.0 定义序列化器
3.0 修改settings.py配置文件
4.0 同步数据库
5.0 编写视图
6.0 编写路由
7.0 插入数据
8.0 验证数据
1.1 定义数据模型

在这里插入图片描述

1.2 定义序列化器

在这里插入图片描述

1.3 修改settings.py配置文件

在这里插入图片描述

1.4 同步数据库
python3  manage.py makemigrations  #同步数据
python3  manage.py  migrate    #迁移数据
1.5 编写视图
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.status import HTTP_404_NOT_FOUND
from myapp.serializers import UserSerializer
from myapp.models import User

class UserView(APIView):
    def get(self, request):
        #print(request.query_params)
        queryset = User.objects.all() #调用序列化器将queryset转化成json 
        user_ser =UserSerializer(queryset,many=True) #序列化器多条数据指定many=True
        return Response(user_ser.data)
    def post(self, request):
        print(request.data)
        data ={
    
    'result': 'post'}
        return Response(data)
    def put(self, request):
        print(request.data)
        data ={
    
    'result': 'put'}
        return Response(data)
    def delete(self, request):
        print(request.data)
        data ={
    
    'result': 'delete'}
        return Response(data)
1.6 编写路由

在这里插入图片描述
在这里插入图片描述

1.7 插入数据

在这里插入图片描述

1.8 验证(APIView请求方式)

在这里插入图片描述

2.0 改写GenericAPIView方法

2.1 get请求获取所有数据

在这里插入图片描述
在这里插入图片描述
能够成功获取数据,并且看到定义的code和msg

2.2 get请求获取单条数据

配置app路由
在这里插入图片描述
新增视图判断
在这里插入图片描述
验证
在这里插入图片描述

3.0认识 ViewSet

GenericAPIview有一个问题获取所有用户和单个用户数据需要定义两个视图和URL路由,使用ViewSet可以很好解决这个问题,并且实现路由自动映射。
Viewset视图集不再实现get(),post()等方法,而是实现以下请求方法动作:

list():获取所有数据
retrieve(): 获取单个数据
create():创建数据
update():更新数据
destory();删除数据
3.1 改写 路由
from django.urls import path, re_path
from  myapp import views


urlpatterns = [
    re_path('^user/$', views.UserView.as_view({
    
    'get':'list','post':'create'})),#获取所有数据,创建
    re_path('^user/(?P<id>\d+)/$', views.UserView.as_view({
    
    'get':'retrieve','put':'update','delete':'destory'})),  #获取单条数据,更新,删除/user/id
]

3.2 改写视图
from rest_framework.response import Response
from rest_framework.viewsets import ViewSet
from myapp.serializers import UserSerializer
from myapp.models import User

class UserView(ViewSet):
	lookup_field = 'id'   #默认值pk 改成id
    def retrieve(self, request, id=None):   #查询单个数据
        obj = User.objects.get(id=id)
        user_ser = UserSerializer(obj)
        res ={
    
    'code':200,'msg':'成功','data':user_ser.data}
        return Response(res)
    def list(self, request):   #查询所有数据
        queryset = User.objects.all()
        user_ser = UserSerializer(queryset, many=True)
        res = {
    
    'code': 200, 'msg': '成功', 'data': user_ser.data}
        return Response(res)

    def create(self, request):   #创建用户
        user_ser =UserSerializer(data=request.data)
        user_ser.is_valid(raise_exception=True)
        user_ser.save()
        res = {
    
    'code':200,'msg':'创建用户成功'}
        return Response(res)
    def update(self, request, id=None):  #更新用户
        obj = User.objects.get(id=id)
        user_ser = UserSerializer(instance=obj, data=request.data)
        if user_ser.is_valid():
            user_ser.save()
            res = {
    
    'code': 200, 'msg': '更新用户成功'}
        else:
            res = {
    
    'code': 500, 'msg': '更新用户失败,数据格式不正确'}
        return Response(res)
    def destory(self, request, id=None):  #删除用户
        obj = User.objects.get(id=id)
        obj.delete()
        res = {
    
    'code': 200, 'msg': '删除用户成功!'}
        return Response(res)
3.3 验证

在这里插入图片描述
在这里插入图片描述
最终实现增删改查所有数据

3.4 使用自动路由实现注册api(urls.py)

在这里插入图片描述

http://127.0.0.1:8000/myapp/api/

在这里插入图片描述

实现路由的自动注册

在这里插入图片描述

4 ModelviewSet类

ModelviewSet继承GenericAPlview和五个扩展类,封装好各种请求更加完善业务逻辑,基本不用自己编写,只需要指定serializer_class和queryset,就可以直接进行增删改查。
在这里插入图片描述
views.py配置如图所示

from rest_framework.response import Response
from rest_framework.viewsets import ViewSet,ModelViewSet
from myapp.serializers import UserSerializer
from myapp.models import User

class UserView(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

urls.py配置自动路由即可实现增删改查
在这里插入图片描述

各个类的比较如下

在这里插入图片描述

4.1 重写 create和list方法增加返回值

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43546282/article/details/128805872