Django 第五章RESTFramework(DRF)框架初探以及认识serializers序列化器的增删改查

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

在这里插入图片描述

定义
Django REST framework (简称 DRF) 是一个强大灵活的wb api工具 功能完善可快速开发api平台
官网地址

https://www.django-rest-framework.org/

安装要求
在这里插入图片描述

pip3 install django==3.2
pip3 install djangorestframework

1.0 使用drf实现用户的增删改查

1.创建app
2.定义数据模型并同步数据库
3.编写序列化器文件
4.编写视图
5.添加api路由

1.1修改settings.py文件

在这里插入图片描述

1.2 创建一个app

python3  manage.py startapp myapp_api

1.3 定义数据模型并同步(models.py)

from django.db import models

# Create your models here.
class User(models.Model):
    name = models.CharField(max_length=30)
    city = models.CharField(max_length=30)
    sex = models.CharField(max_length=30)
    age = models.IntegerField()
python3  manage.py makemigrations  #同步数据
python3  manage.py  migrate    #迁移数据

1.4 编写序列化器文件(serializers.py)

在这里插入图片描述

from  myapp_api.models import User
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

1.5 编写视图(views.py)

from  rest_framework import viewsets
from .serializers import UserSerializer
from myapp_api.models import User

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()      #指定操作的数据库
    serializer_class = UserSerializer  #指定序列化器

1.6添加路由api

1.6.1 主路由
在这里插入图片描述
1.6.2 app路由

from django.urls import path, include
from  myapp_api import views
from rest_framework import routers


#自动注册路由
router = routers.DefaultRouter()
router.register(r'user',views.UserViewSet)

urlpatterns = [
    path('api/', include(router.urls)), #类视图

]

在这里插入图片描述

1.7 验证

http://127.0.0.1:8000/myapp_api/api/

在这里插入图片描述

post请求验证

在这里插入图片描述

get请求验证

在这里插入图片描述

put请求验证更新更新年龄35

在这里插入图片描述

delete请求验证

在这里插入图片描述

最终实现数据的增删改查功能

2.0 python 三种常用的序列化方式

2.1 JSON模块

序列化应用场景用ORM查询数据采用JSON格式api返回数据
反序列化应用场景从别的api获取数据在python里处理
在这里插入图片描述

2.2 Django内置的JsonResponse模块

JsonResponse模块自动将pthon对象转化为json对象并响应
在这里插入图片描述
缺点 只能序列化,不支持反序列化,不支持将json对象转化成python对象

2.3 django内置serializers模块

serializers是Django内置的一个序列化器可直接将python QuerySet对象转化成json格式但是不支持反序列化。
在这里插入图片描述
在这里插入图片描述
DRF中有个serializers模块专门负责数据的序列化。
序列化器支持的三种类型

Serializer: `对Model数据模型进行序列化需自动移字段映射`
ModelSerializer: `对Model数据模型进行序列化,会自动生成字段和验证规则默认包含简单的create()和update()方法`
HyperlinkedModelSerializer: `与ModelSerializer类似只不过使用超链接来便是关系而不是主键ID`

2.3.1 单独使用 Serializer序列化器实现增删改查

第一步修改serializers.py文件

from  myapp_api.models import User
from rest_framework import serializers

class UserSerializer(serializers.Serializer):
    #这里字段必须与使用的模型字段对应
    id = serializers.IntegerField()   
    name = serializers.CharField()
    city = serializers.CharField()
    sex = serializers.CharField()
    age = serializers.IntegerField()

第二步编写视图

from  rest_framework.views  import APIView
from .serializers import UserSerializer
from myapp_api.models import User
from rest_framework.response import Response

class UserView(APIView):
    def get(self,request):
        #获取所有用户
        queryset = User.objects.all()
        #调用序列化器将queryset对象 转化为json
        user_ser = UserSerializer(queryset, many=True)#如果序列化多条数据需要指定many=True
        # .data是获取序列化结果
        return Response(user_ser.data)
    def post(self,request):
        pass
    def put(self,request):
        pass
    def delete(self,request):
        pass

第三步编写路由

from django.urls import path, re_path
from  myapp_api import views


urlpatterns = [
    re_path('^api/user/$', views.UserView.as_view()),

]

第四步 验证
在这里插入图片描述

第五步 查询单用户数据

from  rest_framework.views  import APIView
from .serializers import UserSerializer
from myapp_api.models import User
from rest_framework.response import Response

class UserView(APIView):
    def get(self, request, id=None):
        if id:
            #获取单用户
            obj = User.objects.get(id=id)
            # 调用序列化器将queryset对象 转化为json
            user_ser =UserSerializer(obj)
        else:
            #获取所有用户
            queryset = User.objects.all()
            #调用序列化器将queryset对象 转化为json
            user_ser = UserSerializer(queryset, many=True)#如果序列化多条数据需要指定many=True
            # .data是获取序列化结果
        return Response(user_ser.data)
    def post(self,request):
        pass
    def put(self,request):
        pass
    def delete(self,request):
        pass

在这里插入图片描述

第六步 创建用户

1.0

def post(self,request):
    #调用序列化器将提交的数据进行反序列化
    user_ser = UserSerializer(data=request.data) #request.data是用户提交的post数据
    if user_ser.is_valid():
        #保存数据
        user_ser.save()
        res = {'code': 200, 'msg': '创建用户成功'}
    else:
        res = {'code':500, 'msg': '创建用户失败数据格式不正确'}

在这里插入图片描述
2.0 在序列化类将数据进行重写
在这里插入图片描述

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

第七步 更新用户数据

7.1 编写serializers.py 更新用户数据重写数据库
在这里插入图片描述
7.2 编写put更新接口

def put(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)

7.3 测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
异常情况测试格式不对会直接报错
在这里插入图片描述
在这里插入图片描述

第八步 编写删除用户的接口

def delete(self,request,id=None):
    obj = User.objects.get(id=id)
    obj.delete()
    res = {'code': 200, 'msg': '删除用户成功'}
    return Response(res)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
删除成功

http://127.0.0.1:8000/myapp_api/api/user/

至此使用serializers序列化器实现了增删改查的api接口编写测试

序列化视图ORM查询数据库---> 数据产乳序列化器--->从 .data获取数据--->响应前端
反序列化获取用户提交数据--->数据传入序列化器--->调用.save保存数据(重写create和update方法)

序列化器常用的方法和属性
serializer.is_valid(): 调用序列化器验证是否通过传入raise_exception=True可以在验证失败时由DRF响应400异常
serializer.errors:获取反序列化器的错误信息
serializer.data: 获取序列化器返回的数据
serializer.save():将验证通过的数据保存到数据库(ORM操作)
完整的接口如下

from  rest_framework.views  import APIView
from .serializers import UserSerializer
from myapp_api.models import User
from rest_framework.response import Response

class UserView(APIView):
    def get(self, request, id=None):
        if id:
            obj = User.objects.get(id=id)  # 获取单用户调用序列化器将queryset对象 转化为json
            user_ser =UserSerializer(obj)
        else:
            queryset = User.objects.all() ##获取所有用户调用序列化器将queryset对象 转化为json
            user_ser = UserSerializer(queryset, many=True)#如果序列化多条数据需要指定many=True
        return Response(user_ser.data)             # .data是获取序列化结果
    def post(self,request):
        user_ser = UserSerializer(data=request.data) #request.data是用户提交的post数据
        if user_ser.is_valid():
            user_ser.save()
            res = {'code': 200, 'msg': '创建用户成功'}
        else:
            res = {'code':500, 'msg': '创建用户失败数据格式不正确'}
        return Response(res)

    def put(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 delete(self,request,id=None):
        obj = User.objects.get(id=id)
        obj.delete()
        res = {'code': 200, 'msg': '删除用户成功'}
        return Response(res)

在这里插入图片描述

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: go

“Django 第五章RESTFramework(DRF)框架初探以及认识serializers序列化器的增删改查” 的相关文章