drf--part1

it2023-04-12  79

drf--part1

一、drf(Django Rest_Framework)二、序列化介绍1、序列化2、反序列化 三、环境安装与配置四、drf完全简写代码的过程五、 序列化器-Serializer1、序列化2、反序列化

一、drf(Django Rest_Framework)

Django rest framework是一个建立在django基础上的web应用开发框架,可以快速开发rest api接口应用,在rest framework中,提供了序列化器Serializier,可以帮助我们简化序列化与反序列化过程,不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作,并且提供了一个API 的Web可视化界面来方便查看测试接口

二、序列化介绍

在api接口的开发中,最核心、最常见的部分就是序列化,所谓序列化就是把数据转换格式,序列化可以分为两个阶段:

1、序列化

把我们识别的数据转换成指定的格式提供给别人

例如:在Django中,我们默认获取到的数据是模型对象,但模型对象无法直接提供给前端或别的平台使用,所以我们要把数据序列化,将数据转换为字符串或json数据,提供给别人

2、反序列化

把别人提供的数据还原成我们想要的格式

例如:前端js提供过来的json数据,对于python而言就是字符串,我们需要进行反序列化转换为模型类对象,以便于保存到数据库中

三、环境安装与配置

1、

pip3 install django==2.2 pip3 install djangorestframework

使用pip安装django和drf 2、 在settings.py的INSTALLED_APPS中添加‘rest_framework’

完成后,就可以使用drf进行api接口开发了,主要有以下三个步骤:

将请求的数据转换为模型类对象操作数据库将模型类对象转换为响应的数据

四、drf完全简写代码的过程

一、创建模型操作类:

class Student(models.Model): # 模型字段 name = models.CharField(max_length=100,verbose_name="姓名",help_text='提示文本:不能为空') sex = models.BooleanField(default=1,verbose_name="性别") age = models.IntegerField(verbose_name="年龄") class_null = models.CharField(max_length=5,verbose_name="班级编号") description = models.TextField(max_length=1000,verbose_name="个性签名") class Meta: db_table="tb_student" verbose_name = "学生" verbose_name_plural = verbose_name

二、数据库连接成功后,执行数据迁移: python manage.py makemigration python manage.py migrate

django2.2数据迁移可能出现的报错: 报错一:

解决方案: 注释掉python/site-packages/django/backends/mysql/base.py中的版本判断代码

报错二:

解决方案: backends/mysql/operations.py146行左右新增一行代码:

三、创建序列化器 (1)在项目下的应用中添加一个serializer.py文件,用于保存该应用的序列化器 serializer.py:

from rest_framework.serializers import ModelSerializer from django1 import models class studentserialize(ModelSerializer): class Meta: model=models.Student fields="__all__" model 指明该序列化器处理的字段从models.student模型类参考生成指明该序列化器包含模型类的哪些字段,'all’指包含所有字段

(2)编写视图,在应用中的views.py中创建视图类 views.py:

from django.shortcuts import render from django1 import models from rest_framework.viewsets import ModelViewSet from .serializers import studentserialize # Create your views here. class studentview(ModelViewSet): queryset = models.Student.objects.all() serializer_class = studentserialize queryset 指明该视图集在查询数据时使用的查询集serializer_class 指明该视图在序列化及反序列化时使用的序列化器

(3)应用配置文件 添加rest_framework settings.py

(4)在应用中新建一个路由文件,配置url django1/urls.py

from django.conf.urls import url from django.contrib import admin from django.urls import path from django1 import views from rest_framework.routers import DefaultRouter urlpatterns = [ url(r'^admin/', admin.site.urls), ] # 先实例化一个router对象,可处理视图的路由器 router=DefaultRouter() # 向路由器中注册视图集 router.register('students',views.studentview) # 将路由器中的所有路由信息追加到项目路由表中 urlpatterns += router.urls

(5) 配置项目路由文件 Django_project/urls.py

from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path('stu/',include("django1.urls")) ]

完成后,runserver+端口启动Django,我们可以通过浏览器访问drf内置的接口调试界面

在表单填写学生信息,保存学生信息

http://127.0.0.1:8080/stu/students/1/可以获取单一学生信息:

五、 序列化器-Serializer

作用: 1、序列化,序列化器会把模型对象转换为字典,经过response后变成json字符串 2、反序列化,把客户端发送过来的数据,通过request变成字典,再将字典转换为模型 3、在反序列化的过程中完成数据校验

1、序列化

我们在django_project项目中再创建一个应用django2(python manage.py startapp django2),可在数据迁移后在数据库中手动添加一条数据,id默认为1

一、定义序列化器

from rest_framework import serializers # 声明序列化器,所有序列化器都要直接或间接继承serializer,ModelSerializer是Serializer的子类 class teacherserialize(serializers.Serializer): # 要进行数据转换的字段 name = serializers.CharField() sex = serializers.BooleanField() age = serializers.IntegerField() class_null = serializers.CharField() description = serializers.CharField()

二、序列化

from django.shortcuts import render from django.views import View from django2.models import Teacher from .serializers import teacherserialize from django.http.response import JsonResponse # Create your views here. class StudentView(View): def get(self,request): # 获取数据 teacher=Teacher.objects.get(id=1) # 序列化 serializers=teacherserialize(instance=teacher) # 响应数据 return JsonResponse(serializers.data)

在序列化过程中,如果要序列化多条数据,则需要加many=True参数,如果要序列化中文,则需要加json_dumps_params={‘ensure_ascii’:False}参数

三、在应用中添加路由

from django.contrib import admin from django.urls import path,include from django2 import views urlpatterns = [ path('admin/', admin.site.urls), path('teacher/',views.TeacherView.as_view()) ]

四、在项目总路由

from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path('stu/',include("django1.urls")), path('ser/',include("django2.urls")) ]

完成后启动django项目,浏览器通过http://127.0.0.1:8090/ser/teacher/可查询到序列化后数据:

如果想使用drf的接口调试界面,views.py中需使用response方法响应:

from django.shortcuts import render from django.views import View from django2.models import Teacher from .serializers import teacherserialize # from django.http.response import JsonResponse from rest_framework.response import Response from rest_framework.views import APIView # Create your views here. class TeacherView(APIView): def get(self,request): # 获取数据 teacher=Teacher.objects.get(id=1) # 序列化 serializers=teacherserialize(instance=teacher) # 响应数据 return Response(serializers.data)

访问页面:

2、反序列化

继续拿Django2应用举例: 反序列化存在校验功能,我们可以将序列化组件改为反序列化组件

反序列化组件:

serializers.py:

from rest_framework import serializers def judege(val): if 'W' in val: raise serializers.ValidationError('存在非法字符') else: return val # 声明序列化器,所有序列化器都要直接或间接继承serializer,ModelSerializer是Serializer的子类 class teacherserialize(serializers.Serializer): # 括号内写校验条件 name = serializers.CharField(max_length=4,validators=[judege,]) age = serializers.IntegerField(max_value=68) class_null = serializers.CharField() # allow_blank允许为空字符串 description = serializers.CharField(allow_blank=True)

视图类写法

我们使用post请求来访问 views.py:

from django.shortcuts import render,HttpResponse from django.views import View from django2.models import Teacher from .serializers import teacherserialize from django.http.response import JsonResponse # from rest_framework.response import Response # from rest_framework.views import APIView # Create your views here. class TeacherView(View): # def get(self,request): # # 获取数据 # teacher=Teacher.objects.get(id=1) # # 序列化 # serializers=teacherserialize(instance=teacher) # # 响应数据 # return JsonResponse(serializers.data) def post(self,request): print(request.POST) data={ 'name':request.POST.get('name'), 'age':request.POST.get('age'), 'class_null':request.POST.get('class_null'), 'description':request.POST.get('description') } ser=teacherserialize(data=data) print(ser.is_valid()) print(ser.errors) print(ser.validated_data) return HttpResponse('ok')

接下来我们使用postman发送请求来进行测试:

首先我们发送一个合法校验请求:

如图,请求成功,返回ok,此时我们来看看服务端返回结果

我们可以通过validata_data属性来获取发送过来的数据

此时我们再传入一个非法请求:

我们会得到错误信息:

如图,因为我们通过ser.is_vaild()和ser.error展示了错误信息,所以我们得到了校验失败False以及error提示信息

最新回复(0)