DRF初识攻坚(三)-----序列器(ModelSerializer)、视图集(ModelViewSet)、路由

一、序列器(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/

跳转至总篇目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值