一、序列器(ModelSerializer)
- 功能:常规使用,基本操作均封装
- 代码(以上等同上一篇:序列器(Serializer)所实现的增删改查)
from rest_framework import serializers from api import models class StuDetailSerializer(serializers.ModelSerializer): '''StuDetail表序列器''' # 自定义序列化器的字段(可存在于模型数据中,也可不存在) # 此处字段edit_time仅显示调用StuDetailViewSet函数中recordfun方法的当前时间 # 因为没进入数据库,所以,给客户端返回数据后,此字段即清除 edit_time = serializers.TimeField(allow_null=True) # ModelSerializer会从类Meta中取配置数据,未写就用默认的 class Meta: # 必填:导入数据库模型 model = models.StuDetail # 必填:指定序列化和反序列化字段 # 序列化全部字段 # fields = "__all__" # 序列化指定字段 fields = ["id", "birthday", "height", "gender"] # 指定有只读属性字段,非get操作:客户可以任意传且不报错,程序实际会直接丢弃该字段 # read_only_fields = ["gender"] # 自动序列化连表操作:depth表示的是在从数据库中获取数据是的深度,默认为0,表示只取最外层 # 当1的时候指的是再往下取一层,django设置的最大深度为10,但实际的开发中最好不要超过三层 # depth = 1 # 额外增加校验条件 extra_kwargs = { "height" : { "max_value": 200.0, "min_value": 150.0 }, } class PublishSerializer(serializers.ModelSerializer): '''Publish表序列器''' class Meta: model = models.Publish fields = "__all__" class StuSerializer(serializers.ModelSerializer): '''Stu表序列器''' class Meta: model = models.Stu fields = "__all__" class BookSerializer(serializers.ModelSerializer): '''Book表序列器''' class Meta: model = models.Book fields = "__all__"
二、视图集(ModelViewSet)
- 视图类继承关系
- 文件位置:/api/views.py
- 代码
from rest_framework import viewsets from rest_framework.decorators import action from rest_framework.response import Response from api import models, serializers import time class StuDetailViewSet(viewsets.ModelViewSet): # 传入instance,关联数据库模型 queryset = models.StuDetail.objects.all() # 传入serializer,关联序列化器 serializer_class = serializers.StuDetailSerializer # 操作的是表统计,装饰器生成路由:“域名/表名/方法名/” # 此处为get方法调用"http://127.0.0.1:8000/studetail/sheetfun/" @action(methods=["GET"], detail=False) def sheetfun(self, request): """此函数功能是获取身高大于175的学生详情返回客户端""" # 1、获取数据库数据对象:获取身高大于175的学生详情 # 方法get_queryset可过滤自身数据库模型,返回queryset对象数据 studetail_objs = self.get_queryset().filter(height__gt=175) # 2、创建序列化器对象:翻译模型数据为json # 方法get_serializer可调用自身序列化器,做序列化 serializer = self.get_serializer(instance=studetail_objs, many=True) # 3、返回响应,注意变量名是单数,别写错 return Response(serializer.data) # 操作的是表的具体记录,装饰器生成路由:“域名/表名/pk值/方法名/” # 此处为put方法调用"http://127.0.0.1:8000/studetail/2/sheetfun/" # detail参数:明确是否读取路由中的pk值 @action(methods=["PUT"], detail=True) def recordfun(self, request, pk): """此函数功能PUT方法修改学生详情""" # 1、获取请求体里的数据:可修改 # 返回:1 print(request.data['gender']) # 返回:<QueryDict: {..., 'height': ['165.7'], ...}> print(request.data) # 方法get_object根据路由的pk值自动获取模型中相应数据 studetail_obj = self.get_object() # 2、反序列化:翻译请求体里的数据到数据库 # 方法:get_serializer创建序列化器对象,传入模型数据,客户端的数据,做反序列化 serializer = self.get_serializer(instance=studetail_obj, data=request.data) # 校验 serializer.is_valid(raise_exception=True) # 入库 serializer.save() # 3、返回响应,注意变量名是单数,别写错 return Response(serializer.data) class PublishViewSet(viewsets.ModelViewSet): queryset = models.Publish.objects.all() serializer_class = serializers.PublishSerializer class StuViewSet(viewsets.ModelViewSet): queryset = models.Stu.objects.all() serializer_class = serializers.StuSerializer class BookViewSet(viewsets.ModelViewSet): queryset = models.Book.objects.all() serializer_class = serializers.BookSerializer
三、路由(针对视图集)
- 文件/main/urls.py
from api import views, serializers from rest_framework.routers import SimpleRouter # 原urls.py文件列表清空,也可以在此做路由分发,到app中再实例化SimpleRouter urlpatterns = [ ] # 创建缩略视图实例 router = SimpleRouter() # 将视图集及路由做映射,注册进实例中 router.register('studetail', views.StuDetailViewSet) router.register('publish', views.PublishViewSet) router.register('stu', views.StuViewSet) router.register('book', views.BookViewSet) # 将实例的属性urls加到原urls.py文件的列表中 urlpatterns += router.urls
四、显示
- 增操作POST
- 改操作(PUT):必须提供全部字段
- 改操作(PATCH):提供必要字段即可
- 查操作(GET)
- 查列表:
http://127.0.0.1:8000/book/
- 查表中具体记录:
http://127.0.0.1:8000/book/1/
- 查列表:
- 删操作(DELETE)
- 删记录:
http://127.0.0.1:8000/book/1/
- 默认不允许删列表:
http://127.0.0.1:8000/book/
- 删记录: