在开发Web应用中,有两种应用模式:html
为了在团队内部造成共识、防止我的习惯差别引发的混乱,咱们须要找到一种你们都以为很好的接口实现规范,并且这种规范可以让后端写的接口,用途一目了然,减小双方之间的合做成本。前端
目前市面上大部分公司开发人员使用的接口服务架构主要有:restful、rpc。python
rpc: 翻译成中文:远程过程调用[远程服务调用].mysql
http://www.luffy.com/apigit
post请求github
action=get_all_student¶ms=301&sex=1web
接口多了,对应函数名和参数就多了,前端在请求api接口时,就会比较难找.容易出现重复的接口sql
restful: 翻译成中文: 资源状态转换.数据库
django
那么接口请求数据,本质上来讲就是对资源的操做了.
web项目中操做资源,无非就是增删查改.因此要求在地址栏中声明要操做的资源是什么,而后经过http请求动词来讲明对资源进行哪种操做.
POST http://www.luffy.com/api/students/ 添加学生数据
GET http://www.luffy.com/api/students/ 获取全部学生
DELETE http://www.luffy.com/api/students/<pk> 删除1个学生
REST全称是Representational State Transfer,中文意思是表述(编者注:一般译为表征)性状态转移。 它首次出如今2000年Roy Fielding的博士论文中。
RESTful是一种定义Web API接口的设计风格,尤为适用于先后端分离的应用模式中。
这种风格的理念认为后端开发任务就是提供数据的,对外提供的是数据资源的访问接口,因此在定义接口时,客户端访问的URL路径就表示这种要操做的数据资源。而对于数据资源分别使用POST、DELETE、GET、UPDATE等请求动做来表达对数据的增删查改。
事实上,咱们可使用任何一个框架均可以实现符合restful规范的API接口。
参考文档:http://www.runoob.com/w3cnote/restful-architecture.html
api接口开发,最核心最多见的一个过程就是序列化,所谓序列化就是把数据转换格式。
序列化能够分两个阶段:
把咱们识别的数据转换成指定的格式提供给别人。
例如:咱们在django中获取到的数据默认是模型对象,可是模型对象数据没法直接提供给前端或别的平台使用,因此咱们须要把数据进行序列化,变成字符串或者json数据,提供给别人。
把别人提供的数据转换/还原成咱们须要的格式。
例如:前端js提供过来的json数据,对于python而言就是字符串,咱们须要进行反序列化换成模型类对象,这样咱们才能把数据保存到数据库中。
核心思想: 缩减编写api接口的代码
Django REST framework是一个创建在Django基础之上的Web 应用开发框架,能够快速的开发REST API接口应用。
在REST framework中,提供了序列化器Serializer的定义,能够帮助咱们简化序列化与反序列化的过程,不只如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工做。
REST framework提供了认证、权限、限流、过滤、分页、接口文档等功能支持。
REST framework提供了一个API 的Web可视化界面来方便查看测试接口。
中文文档:https://q1mi.github.io/Django-REST-framework-documentation/#django-rest-framework
github: https://github.com/encode/django-rest-framework/tree/master
特色:
提供了定义序列化器Serializer的方法,能够快速根据 Django ORM 或者其它库自动序列化/反序列化;
提供了丰富的类视图、Mixin扩展类,简化视图的编写;
丰富的定制层级:函数视图、类视图、视图集合到自动生成 API,知足各类须要;
多种身份认证和权限认证方式的支持;[jwt]
内置了限流系统;
直观的 API web 界面;
可扩展性,插件丰富
DRF须要如下依赖:
Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6)
Django (1.10, 1.11, 2.0)
DRF是以Django扩展应用的方式提供的,因此咱们能够直接利用已有的Django环境而无需重新建立。(若没有Django环境,须要先建立环境安装Django)
前提是已经安装了django,建议安装在虚拟环境。虚拟环境参考地址
# 注意:切换到对应目录下执行 # mkvirtualenv drfdemo -p python3 # pip install django pip install djangorestframework pip install pymysql
django-admin startproject drfdemo
使用pycharm打开项目,设置虚拟环境的解释器。
INSTALLED_APPS = [ ... 'rest_framework', ]
接下来就可使用DRF提供的功能进行api接口开发了。在项目中若是使用rest_framework框架实现API接口,主要有如下三个步骤:
将请求的数据(如JSON格式)转换为模型类对象
操做数据库
接下来,咱们快速体验下四天后咱们学习完成drf之后的开发代码。接下来代码不须要理解,看步骤。
class Student(models.Model): # 模型字段 name = models.CharField(max_length=100,verbose_name="姓名") 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
回忆以前所学的Django使用MySQL数据库的步骤执行。
例如,咱们在django项目中建立学生子应用。
python3 manage.py startapp students
在syudents应用目录中新建serializers.py用于保存该应用的序列化器。
建立一个StudentModelSerializer用于序列化与反序列化。
from rest_framework import serializers from students.models import Student # 建立序列化器类,回头会在视图中被调用 class StudentModelSerializer(serializers.ModelSerializer): class Meta: model = Student fields = "__all__" # fields = ("id", "name") # 也可指定字段
fields 指明该序列化器包含模型类中的哪些字段,'all'指明包含全部字段
在students应用的views.py中建立视图StudentViewSet,这是一个视图集合。
from rest_framework.viewsets import ModelViewSet from students.models import Student from students.serializers import StuentModelSerializer class StuentAPIView(ModelViewSet): queryset = Student.objects.all() serializer_class = StuentModelSerializer
serializer_class 指明该视图在进行序列化或反序列化时使用的序列化器
在students应用的urls.py中定义路由信息。
from rest_framework.routers import DefaultRouter from students import views urlpatterns = [] # 路由列表 router = DefaultRouter() # 能够处理视图的路由器 router.register('student', views.StuentAPIView) # url进行注册 urlpatterns += router.urls # 将路由器中的全部路由信息追加到django的路由列表中
最后把students子应用中的路由文件加载到总路由文件中.
urlpatterns = [ path('admin/', admin.site.urls), path('drf/', include("students.urls")), ]
运行当前程序(与运行Django同样)
python3 manage.py runserver
在浏览器中输入网址: 127.0.0.1:8000/drf/,能够看到DRF提供的API Web浏览页面:
在浏览器中输入网址:
点击PUT,返回以下页面信息:
做用:
1. 序列化,序列化器会把模型对象转换成字典,通过response之后变成json字符串
2. 反序列化,把客户端发送过来的数据,通过request之后变成字典,序列化器能够把字典转成模型
3. 反序列化,完成数据校验功能
Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializer。
python manage.py startapp ser
咱们仍是继续使用student下的模型类。
下面咱们为这个模型类提供一个序列化器,能够定义以下:
from rest_framework import serializers # 全部的自定义序列化器必须直接或间接继承于 serializers.Serializer class StudentSerializer(serializers.Serializer): # 声明序列化器 # 1. 字段声明[ 要转换的字段,固然,若是写了第二部分代码,有时候也能够不用写字段声明 ] id = serializers.IntegerField() name = serializers.CharField() sex = serializers.BooleanField() age = serializers.IntegerField() class_null = serializers.CharField() description = serializers.CharField() # 2. 可选[ 若是序列化器继承的是ModelSerializer,则须要声明对应的模型和字段, ModelSerializer是Serializer的子类 ] # 3. 可选[ 用于对客户端提交的数据进行验证 ] # 4. 可选[ 用于把经过验证的数据进行数据库操做,保存到数据库 ]
字段 | 字段构造方式 |
---|---|
BooleanField | BooleanField() |
NullBooleanField | NullBooleanField() |
CharField | CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True) |
EmailField | EmailField(max_length=None, min_length=None, allow_blank=False) |
RegexField | RegexField(regex, max_length=None, min_length=None, allow_blank=False) |
SlugField | SlugField(maxlength=50, min_length=None, allow_blank=False) 正则字段,验证正则模式 [a-zA-Z0-9-]+ |
URLField | URLField(max_length=200, min_length=None, allow_blank=False) |
UUIDField | UUIDField(format='hex_verbose') format: 1)'hex_verbose'如"5ce0e9a5-5ffa-654b-cee0-1238041fb31a" 2)'hex' 如 "5ce0e9a55ffa654bcee01238041fb31a" 3)'int' 如:"123456789012312313134124512351145145114" 4)'urn' 如:"urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a" |
IPAddressField | IPAddressField(protocol='both', unpack_ipv4=False, **options) |
IntegerField | IntegerField(max_value=None, min_value=None) |
FloatField | FloatField(max_value=None, min_value=None) |
DecimalField | DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None) max_digits: 最多位数 decimal_palces: 小数点位置 |
DateTimeField | DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None) |
DateField | DateField(format=api_settings.DATE_FORMAT, input_formats=None) |
TimeField | TimeField(format=api_settings.TIME_FORMAT, input_formats=None) |
DurationField | DurationField() |
ChoiceField | ChoiceField(choices) choices与Django的用法相同 |
MultipleChoiceField | MultipleChoiceField(choices) |
FileField | FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL) |
ImageField | ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL) |
ListField | ListField(child=, min_length=None, max_length=None) |
DictField | DictField(child=) |
选项参数:
参数名称 | 做用 |
---|---|
max_length | 最大长度 |
min_lenght | 最小长度 |
allow_blank | 是否容许为空 |
trim_whitespace | 是否截断空白字符 |
max_value | 最大值 |
min_value | 最小值 |
通用参数:
参数名称 | 说明 |
---|---|
read_only | 代表该字段仅用于序列化输出,默认False |
write_only | 代表该字段仅用于反序列化输入,默认False |
required | 代表该字段在反序列化时必须输入,默认True |
default | 反序列化时使用的默认值 |
allow_null | 代表该字段是否容许传入None,默认False |
validators | 该字段使用的验证器 |
error_messages | 包含错误编号与错误信息的字典 |
label | 用于HTML展现API页面时,显示的字段名称 |
help_text | 用于HTML展现API页面时,显示的字段帮助提示信息 |
定义好Serializer类后,就能够建立Serializer对象了。
Serializer(instance=None, data=empty, **kwarg)
说明:
1)用于序列化时,将模型类对象传入instance参数
2)用于反序列化时,将要被反序列化的数据传入data参数
3)除了instance和data参数外,在构造Serializer对象时,还可经过context参数额外添加数据,如
serializer = StudentSerializer(student, context={'request': request})
经过context参数附加的数据,能够经过Serializer对象的context属性获取。
声明:
序列化器没法直接接收数据,须要咱们在视图中建立序列化器对象时把使用的数据传递过来。
序列化器的字段声明相似于咱们前面使用过的表单系统。
开发restful api时,序列化器会帮咱们把模型数据转换成字典.
drf提供的视图会帮咱们把字典转换成json,或者把客户端发送过来的数据转换字典.
序列化器的使用分两个阶段:
在客户端请求时,使用序列化器能够完成对数据的反序列化。
总路由中的urls.py:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('drf/', include("students.urls")), path('ser/', include("ser.urls")), ]
ser应用下的urls.py文件:
from django.urls import path, re_path from . import views urlpatterns = [ re_path(r"^student/(?P<pk>\d+)/$", views.Student1View.as_view()), ]
ser应用下的views.py文件:
from django.http import JsonResponse from django.views import View from students.models import Student from .serializers import StudentSerializer class Student1View(View): """使用序列化器进行数据的序列化操做""" """序列化器转换一条数据[模型转换成字典]""" def get(self, request, pk): # 接收客户端传过来的参数,进行过滤查询,先查出学生对象 student = Student.objects.get(pk=pk) # 转换数据类型 # 1.实例化序列化器类 """ StudentSerializer(instance=模型对象或者模型列表,客户端提交的数据,额外要传递到序列化器中使用的数据) """ serializer = StudentSerializer(instance=student) # 2.查看序列化器的转换结果 print(serializer.data) return JsonResponse(serializer.data)
from django.urls import path, re_path from . import views urlpatterns = [ path("students/", views.Student2View.as_view()), re_path(r"^student/(?P<pk>\d+)/$", views.Student1View.as_view()), ]
ser应用下的views.py文件:
class Student2View(View): """序列化器转换多条数据[模型转换成字典]""" def get(self, request): student_list = Student.objects.all() # 序列化器转换多个数据 # many=True 表示本次序列化器转换若是有多个模型对象列参数,则必须声明 Many=True serializer = StudentSerializer(instance=student_list, many=True) print(serializer.data) return JsonResponse(serializer.data)
使用序列化器进行反序列化时,须要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象。
在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功返回True,不然返回False。
在定义序列化器时,指明每一个字段的序列化类型和选项参数,自己就是一种验证行为。
ser应用下的serializers.py文件:
""" 在drf中,对于客户端提供的数据,每每须要验证数据的有效性,这部分代码是写在序列化器中的。 在序列化器中,已经提供三个地方给咱们针对客户端提交的数据进行验证。 1. 内置选项,字段声明的小圆括号中,以选项存在做为验证提交 2. 自定义方法,在序列化器中做为对象方法来提供验证[ 这部分验证的方法,必须以"validate_<字段>" 或者 "validate" 做为方法名 ] 3. 自定义函数,在序列化器外部,提早声明一个验证代码,而后在字段声明的小圆括号中,经过 "validators=[验证函数1,验证函数2...]" """ def check_user(data): if data == "oldboy": raise serializers.ValidationError("用户名不能为oldboy!") return data class Student3Serializer(serializers.Serializer): # 声明序列化器 # 1. 字段声明[ 要转换的字段,固然,若是写了第二部分代码,有时候也能够不用写字段声明 ] name = serializers.CharField(max_length=10, min_length=4, validators=[check_user]) sex = serializers.BooleanField(required=True) age = serializers.IntegerField(max_value=150, min_value=0) # 2. 可选[ 若是序列化器继承的是ModelSerializer,则须要声明对应的模型和字段, ModelSerializer是Serializer的子类 ] # 3. 可选[ 用于对客户端提交的数据进行验证 ] """验证单个字段值的合法性""" def validate_name(self, data): if data == "root": raise serializers.ValidationError("用户名不能为root!") return data def validate_age(self, data): if data < 18: raise serializers.ValidationError("年龄不能小于18") return data """验证多个字段值的合法性""" def validate(self, attrs): name = attrs.get('name') age = attrs.get('age') if name == "alex" and age == 22: raise serializers.ValidationError("alex在22时的故事。。。") return attrs
ser应用下的urls.py文件:
urlpatterns = [ path("students/", views.Student2View.as_view()), re_path(r"^student/(?P<pk>\d+)/$", views.Student1View.as_view()), # 对数据提交时,进行校验 path('student3/', views.Student3View.as_view()), ]
ser应用下的views.py文件:
class Student3View(View): def post(self, request): data = request.body.decode() # 反序列化用户提交的数据 data_dict = json.loads(data) print(data_dict) # 调用序列化器进行实例化 serializer = Student3Serializer(data=data_dict) # is_valid在执行的时候,会自动前后调用 字段的内置选项,自定义验证方法,自定义验证函数 # 调用序列化器中写好的验证代码 # raise_exception=True 抛出验证错误信息,并阻止代码继续日后运行 # 验证结果 print(serializer.is_valid(raise_exception=True)) # 获取验证后的错误信息 print(serializer.errors) # 获取验证后的客户端提交的数据 print(serializer.validated_data) # return HttpResponse(serializer.validated_data) return JsonResponse(serializer.validated_data)
前面的验证数据成功后,咱们可使用序列化器来完成数据反序列化的过程.这个过程能够把数据转成模型类对象.
能够经过在序列化器中实现create()和update()两个方法来实现。
class Student3Serializer(serializers.Serializer): # 声明序列化器 # 1. 字段声明[ 要转换的字段,固然,若是写了第二部分代码,有时候也能够不用写字段声明 ] name = serializers.CharField(max_length=10, min_length=4, validators=[check_user]) sex = serializers.BooleanField(required=True) age = serializers.IntegerField(max_value=150, min_value=0) # 2. 可选[ 若是序列化器继承的是ModelSerializer,则须要声明对应的模型和字段, ModelSerializer是Serializer的子类 ] # 3. 可选[ 用于对客户端提交的数据进行验证 ] """验证单个字段值的合法性""" def validate_name(self, data): if data == "root": raise serializers.ValidationError("用户名不能为root!") return data def validate_age(self, data): if data < 18: raise serializers.ValidationError("年龄不能小于18") return data """验证多个字段值的合法性""" def validate(self, attrs): name = attrs.get('name') age = attrs.get('age') if name == "alex" and age == 22: raise serializers.ValidationError("alex在22时的故事。。。") return attrs # 4. 可选[ 用于把经过验证的数据进行数据库操做,保存到数据库 ] def create(self, validated_data): """接受客户端提交的新增数据""" name = validated_data.get('name') age = validated_data.get('age') sex = validated_data.get('sex') instance = Student.objects.create(name=name, age=age, sex=sex) # instance = Student.objects.create(**validated_data) print(instance) return instance def update(self, instance, validated_data): """用于在反序列化中对于验证完成的数据进行保存更新""" name = validated_data.get('name') age = validated_data.get('age') sex = validated_data.get('sex') instance.name = name instance.age = age instance.sex = sex instance.save() return instance
实现了上述两个方法后,在反序列化数据的时候,就能够经过save()方法返回一个数据对象实例了
ser应用下views.py文件:
class Student3View(View): def post(self, request): data = request.body.decode() # 反序列化用户提交的数据 data_dict = json.loads(data) print(data_dict) # 调用序列化器进行实例化 serializer = Student3Serializer(data=data_dict) # is_valid在执行的时候,会自动前后调用 字段的内置选项,自定义验证方法,自定义验证函数 # 调用序列化器中写好的验证代码 # raise_exception=True 抛出验证错误信息,并阻止代码继续日后运行 # 验证结果 print(serializer.is_valid(raise_exception=True)) # 获取验证后的错误信息 print(serializer.errors) # 获取验证后的客户端提交的数据 print(serializer.validated_data) # save 表示让序列化器开始执行反序列化代码。create和update的代码 serializer.save() # return HttpResponse(serializer.validated_data) return JsonResponse(serializer.validated_data)
若是建立序列化器对象的时候,没有传递instance实例,则调用save()方法的时候,create()被调用,相反,若是传递了instance实例,则调用save()方法的时候,update()被调用。
class Student4View(View): def put(self, request, pk): data = request.body.decode() import json data_dict = json.loads(data) student_obj = Student.objects.get(pk=pk) # 有instance参数,调用save方法,就会调用update方法。 serializer = Student3Serializer(instance=student_obj, data=data_dict) serializer.is_valid(raise_exception=True) serializer.save() # 触发序列器中的update方法 return JsonResponse(serializer.validated_data)
ser应用下的urls.py文件:
urlpatterns = [ path("students/", views.Student2View.as_view()), re_path(r"^student/(?P<pk>\d+)/$", views.Student1View.as_view()), # 对数据提交时,进行校验 path('student3/', views.Student3View.as_view()), # 反序列化阶段 re_path(r'^student4/(?P<pk>\d+)/$', views.Student4View.as_view()), ]
""" 开发中每每一个资源的序列化和反序列化阶段都是写在一个序列化器中的 因此咱们能够把上面的两个阶段合并起来,之后咱们再次写序列化器,则直接按照如下风格编写便可。 """ class Student5Serializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) name = serializers.CharField(max_length=10, min_length=4, validators=[check_user]) sex = serializers.BooleanField(required=True) age = serializers.IntegerField(max_value=150, min_value=0) class_null = serializers.CharField(read_only=True) description = serializers.CharField(read_only=True) # 2. 可选[ 若是序列化器继承的是ModelSerializer,则须要声明对应的模型和字段, ModelSerializer是Serializer的子类 ] # 3. 可选[ 用于对客户端提交的数据进行验证 ] """验证单个字段值的合法性""" def validate_name(self, data): if data == "root": raise serializers.ValidationError("用户名不能为root!") return data def validate_age(self, data): if data < 18: raise serializers.ValidationError("年龄不能小于18") return data """验证多个字段值的合法性""" def validate(self, attrs): name = attrs.get('name') age = attrs.get('age') if name == "alex" and age == 22: raise serializers.ValidationError("alex在22时的故事。。。") return attrs # 4. 可选[ 用于把经过验证的数据进行数据库操做,保存到数据库 ] def create(self, validated_data): """接受客户端提交的新增数据""" name = validated_data.get('name') age = validated_data.get('age') sex = validated_data.get('sex') instance = Student.objects.create(name=name, age=age, sex=sex) # instance = Student.objects.create(**validated_data) print(instance) return instance def update(self, instance, validated_data): """用于在反序列化中对于验证完成的数据进行保存更新""" name = validated_data.get('name') age = validated_data.get('age') sex = validated_data.get('sex') instance.name = name instance.age = age instance.sex = sex instance.save() return instance
在ser应用下urls.py文件:
urlpatterns = [ path("students/", views.Student2View.as_view()), re_path(r"^student/(?P<pk>\d+)/$", views.Student1View.as_view()), # 对数据提交时,进行校验 path('student3/', views.Student3View.as_view()), # 反序列化阶段 re_path(r'^student4/(?P<pk>\d+)/$', views.Student4View.as_view()), # 一个序列化器同时实现序列化和反序列化 path('student5/', views.Student5View.as_view()), ]
在ser应用下views.py文件:
class Student5View(View): def get(self, request): # 获取全部数据 student_list = Student.objects.all() serializer = Student5Serializer(instance=student_list, many=True) return JsonResponse(serializer.data, safe=False) def post(self, request): data = request.body.decode() data_dict = json.loads(data) serializer = Student5Serializer(data=data_dict) serializer.is_valid(raise_exception=True) instance = serializer.save() return JsonResponse(serializer.data)
若是咱们想要使用序列化器对应的是Django的模型类,DRF为咱们提供了ModelSerializer模型类序列化器来帮助咱们快速建立一个Serializer类。
在ser应用下serializers.py文件定义模型类序列化器:
""" 咱们可使用ModelSerializer来完成模型类序列化器的声明 这种基于ModelSerializer声明序列化器的方式有三个优点: 1. 能够直接经过声明当前序列化器中指定的模型中把字段声明引用过来 2. ModelSerializer是继承了Serializer的全部功能和方法,同时还编写update和create 3. 模型中同一个字段中关于验证的选项,也会被引用到序列化器中一并做为选项参与验证 """ class StudentModelSerializer(serializers.ModelSerializer): class Meta: model = Student # fields = "__all__" # 表示引用全部字段 fields = ["id", "name", "age", "class_null", "is_18"] # is_18 为自定制字段,须要在models里自定义方法。 # exclude = ["age"] # 使用exclude能够明确排除掉哪些字段, 注意不能和fields同时使用。 # 传递额外的参数,为ModelSerializer添加或修改原有的选项参数 extra_kwargs = { "name": {"max_length": 10, "min_length": 4, "validators": [check_user]}, "age": {"max_value": 150, "min_value": 0}, } def validate_name(self, data): if data == "root": raise serializers.ValidationError("用户名不能为root!") return data def validate(self, attrs): name = attrs.get('name') age = attrs.get('age') if name == "alex" and age == 22: raise serializers.ValidationError("alex在22时的故事。。。") return attrs
在ser应用下的urls.py文件:
urlpatterns = [ path("students/", views.Student2View.as_view()), re_path(r"^student/(?P<pk>\d+)/$", views.Student1View.as_view()), # 对数据提交时,进行校验 path('student3/', views.Student3View.as_view()), # 反序列化阶段 re_path(r'^student4/(?P<pk>\d+)/$', views.Student4View.as_view()), # 一个序列化器同时实现序列化和反序列化 path('student5/', views.Student5View.as_view()), # 使用模型类序列化器 path('student6/', views.Student6View.as_view()), ]
在ser应用下views.py文件:
class Student6View(View): def get(self, request): # 获取全部数据 student_list = Student.objects.all() serializer = StudentModelSerializer(instance=student_list, many=True) return JsonResponse(serializer.data, safe=False) def post(self, request): data = request.body.decode() data_dict = json.loads(data) serializer = StudentModelSerializer(data=data_dict) serializer.is_valid(raise_exception=True) serializer.save() return JsonResponse(serializer.data)