zoukankan      html  css  js  c++  java
  • Django的restframework的序列化组件之对单条数据的处理

    之前我们学习的都是处理书籍或者出版社的所有的数据的方法,下面我们来看下处理单个书籍,或者单个出版社的方法

    这个时候我们就需要重新写一个类,这个类的方法,就需要有3个参数,参数1是self,参数2是request,参数3是id,因为我们是处理单条数据,所有必须要有一个id

    首先我们先写一个类,这个类主要序列化我们的model对象或者queryset的类,这里我们不对一对多和多对多字段做特殊的显示处理,让他用默认值就好了,因为如果我们做特殊的处理,多对多字段在put请求和post请求的处理有点问题,我还是没有解决

    我们的类就是这么简单,默认情况下,一对多字典会显示1表中的数据的id,多对多会显示多表中的id,但是会放在一个列表中

    class bookmodelserializer(serializers.ModelSerializer):
        class Meta:
            model = models.Book
            fields = "__all__"
    

      

    如果我们想控制一对多和多对多显示的字段,我们可以用下面的方法来处理,但是这个时候我们就需要重写update方法和create方法

    class bookmodelserializer(serializers.ModelSerializer):
        class Meta:
            model = models.Book
            fields = "__all__"
        
        # 一对多字段,使用source控制显示的内容
        book_publish = serializers.CharField(source="book_publish.publish_name")
        
        # 多对多字段,需要使用SerializerMethodField这个方法和get_book_auther这个函数配合来显示指定的信息,但是在更新和新建操作就会有问题
        book_auther = serializers.SerializerMethodField()
        def get_book_auther(self, obj):
            s = []
            for i in obj.book_auther.all():
                s.append(i)
    
            return s
    

      

    但是我们这里用默认的方法就好了,不对一对多和多对多字段做特殊的处理

    下面的代码是具体的cbv中的class的代码

    class Book_detail_cbv(APIView):
        def get(self,request,id):
            obj = models.Book.objects.filter(id=id).first()
    
            # bs = bookmodelserializer(obj,many=False,context={'request': request})
            bs = bookmodelserializer(obj, many=False,)
            return Response(bs.data)
    
        def put(self,request,id):
            obj = models.Book.objects.filter(id=id).first()
            bs = bookmodelserializer(obj,data=request.data)
            if bs.is_valid():
                bs.save()
    
                return Response(bs.data)
            else:
                return Response(bs.errors)
    
    
    
        def delete(self,request,id):
            models.Book.objects.filter(id=id).delete()
            return HttpResponse("删除成功")
    

      

    首先看下get请求,就是为了获取单条数据

    首先看下get函数,如果modelserializer类如果传递是一个queryset对象,则many=True,但是如果是一个model对象,则many=False或者可以不写,因为默认就是False

        def get(self,request,id):
            obj = models.Book.objects.filter(id=id).first()
    
            # bs = bookmodelserializer(obj,many=False,context={'request': request})
            bs = bookmodelserializer(obj, many=False,)
            return Response(bs.data)
    

      

    我们通过postman发送get请求的url,我们注意看,一对多和多对多的字段都是显示id

     然后在看下put请求的函数,这里传递一个model对象和request.data进去,调用save方法就会帮我们更新数据库中的数据

        def put(self,request,id):
            obj = models.Book.objects.filter(id=id).first()
            bs = bookmodelserializer(obj,data=request.data)
            if bs.is_valid():
                bs.save()
    
                return Response(bs.data)
            else:
                return Response(bs.errors)
    

      

     我们通过postman发送一个put请求,测试 一下,我们看到数据已经更新

     最后我们在看下delete请求,这里我们就看下代码就可以了

        def delete(self,request,id):
            models.Book.objects.filter(id=id).delete()
            return HttpResponse("删除成功")
    

      

     然后我们通过postman发送delete请求,测试删除的函数

    我们再次get id为3的book就已经get不到了

     至此单条数据的在序列化处理就完成了

  • 相关阅读:
    【bzoj3566】[SHOI2014]概率充电器 树形概率dp
    【bzoj1419】Red is good 期望dp
    【bzoj2698】染色 期望
    【bzoj2134】单选错位 期望
    【bzoj1022】[SHOI2008]小约翰的游戏John 博弈论
    【bzoj3170】[Tjoi 2013]松鼠聚会 旋转坐标系
    【bzoj2338】[HNOI2011]数矩形 计算几何
    【bzoj2085】[Poi2010]Hamsters Hash+倍增Floyd
    【bzoj1014】[JSOI2008]火星人prefix Splay+Hash+二分
    【bzoj2795】[Poi2012]A Horrible Poem Hash+分解质因数
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/10456190.html
Copyright © 2011-2022 走看看