Django的restframework的序列化组件之对单条数据的处理

news/2024/7/4 7:06:05

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

这个时候我们就需要重新写一个类,这个类的方法,就需要有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不到了

 

 

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

 

转载于:https://www.cnblogs.com/bainianminguo/p/10456190.html


http://www.niftyadmin.cn/n/2745325.html

相关文章

MySQL SQL优化教程

转自:https://www.cnblogs.com/duanxz/archive/2013/02/01/2889413.html 一,查询SQL执行效率 通过show status命令了解各种SQL的执行效率。 ?123456789101112131415161718mysql> show status like Com_%;----------------------------------| Variable_name …

关于Flash的一些介绍(一)

一、flash介绍 Flash的前身是Future Wave公司的Future Splash,是世界上第一个商用的二维矢量动画软件,用于设计和编辑Flash文档。1996年美国Macromedia公司收购了Future Wave,并将其改名为Flash。在出到Flash 8以后,Macromedia又被…

P3311 [SDOI2014]数数

思路 看到多个子串并且不能包含的情况,想到了AC自动机 但是题目多了一个不能大于给出的n的限制条件,联想数位dp的过程,设f[i][j][0/1]表示在第i位,AC自动机的第j个节点,数位有/无限制的方案数 dp方程就是对应的转移到子…

内存管理之2:x86页式内存管理

2019独角兽企业重金招聘Python工程师标准>>> date: 2014-09-04 19:09 内存管理的目的是什么?内存管理本身就像一个外观模式,它隐藏底层细节而给应用程序提供一个统一易用的访问内存的接口。程序可以访问4G空间中的任意地址,但实际…

啊撒擦上去

/* 题目内容:在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不 同,借教室人的身份不同,借教室的手续也不一样。面对海量租借教室的信息&…

产妇坐月子里可以吃哪些水果?

产妇坐月子里可以吃哪些水果? 众所周知,生果的营养丰厚,滋味鲜美,人人爱吃。但是生果是生冷的食物,产妇吃了会怕着凉吗?专业的月子中心提示,产妇恰当吃些生果,不仅能添加营养,协助消化&#x…

功能性组件和Classes有什么不同?

React函数组件与React类有何不同? 有一段时间,规范的答案是类可以访问更多功能(如状态)。但是自从有了Hook后,这个答案变得不唯一了。 也许你听说其中一个表现更好。哪一个?许多此类基准都存在缺陷&#xf…

PHP代码常用注释规范(PHP Doc)

PHP代码常用注释规范(PHP Doc) 介绍几个常用的PHP注释 在PHP文件中使用该注释格式开始进行文件注释: /*** author 作者* copyright 版权信息* version 版本* 等等*/ 复制代码 描述一个类的注释: /*** Class 类名* package 命名空间…