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

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

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

Django的restframework的序列化组件之对单条数据的处理的更多相关文章

  1. RestFramework之序列化组件

    一.restframework的序列化组件的使用 1.导入序列化组件与模型类 from rest_framework import serializers from app01.models impo ...

  2. django自带的序列化组件

    1.什么是序列化组件 在django中,自带一个序列化组件,它是用来将数据进行整理.转化成特定的为一个特定的格式(比如json数据格式),然后传输给前端,以便前端对数据进行处理操作. 2.为什么要用序 ...

  3. rest-framework之序列化组件

    一:django自带序列化组件 Django内置的serializers(把对象序列化成json字符串) from django.core import serializers def test(re ...

  4. Django框架第九篇--Django和Ajax、序列化组件(serializers)、自定义分页器、模型表choice参数

    Django和Ajax 一.什么是Ajax AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”.即使用Javascript语 ...

  5. Django day26 HyperlinkedIdentityField,序列化组件的数据校验以及功能的(全局,局部)钩子函数,序列化组件的反序列化和保存

    一:HyperlinkedIdentityField(用的很少):传三个参数:第一个路由名字,用来反向解析,第二个参数是要反向解析的参数值,第三个参数:有名分组的名字 -1 publish = ser ...

  6. Django的rest_framework的序列化组件之序列化多表字段的方法

    首先,因为我们安装了restframework,所以我们需要在django的settings中引入restframework INSTALLED_APPS = [ 'django.contrib.ad ...

  7. Django的rest_framework的序列化组件之serializers.ModelSerializer介绍

    这里的介绍的serializers.ModelSerializer就和我们之前学习的modelform一样 serializers.ModelSerializer如下几个功能 1.序列化queryse ...

  8. rest-framework之APIView 序列化组件

    rest-framework之APIView 一 安装djangorestframework 方式一:pip3 install djangorestframework 方式二:pycharm图形化界面 ...

  9. Django 之restfromwork 序列化组件实现数据增删查改

    rest-framework序列化之Serializer models.py from django.db import models # Create your models here. class ...

随机推荐

  1. Django--templates(模板层)

    模板语法: """ 模板语法: 变量:{{}} 1.深度查询 句点符 2.过滤器 {{value|filter_name:参数}} 标签:{% %} "&quo ...

  2. C++中类的多继承

    在写这一主题的文章之前,在网上找到一篇很非常好的文章C++之继承与多态.就没有必要做重复造轮子的事件了,那就从这篇文章开始吧! 在c++中一个类可以从多个基类中派生(即可以有多个父类),这就是多继承. ...

  3. html兼容手机浏览器

    其实主要就是改掉HTML页面声明: 在网页中加入以下代码,就可以正常显示了: <meta name="viewport" content="width=device ...

  4. android填满手机内存的方法

    1. 进行临界测试,手机盘空间存满的条件下应用会有何表现:通常手动添加大文件但是还是不够,通过如下 2. 使用adb命令完成:通过如下 adb 命令在 /mnt/sdcard/ 目录下产生一个名为 b ...

  5. 最邻近算法(KNN)识别数字验证码

    应用场景   对于简单的数字型验证码的自动识别.前期已经完成的工作是通过切割将验证码图片切割成一个一个的单个数字的图片,并按照对应的数字表征类别进行分类(即哪些图片表示数字7,哪些表示8),将各种数字 ...

  6. ios嵌套H5页面,出现的小bug;

    ios嵌套H5页面,点击数字时就会弹出打电话的功能:解决方法: 在head标签中添加: <meta name="format-detection" content=" ...

  7. hibernate中的sql 1+n 问题

    ( 产生的原因:当一对多或多对多的映射关系下,当在一方添加或修改数据时,一方集合属性中的多方都要发生变化;先select语句,再update语句.当一方集合属性中的数据有很多时,对应的update语句 ...

  8. 处女座和小姐姐(三)-数位dp1.0

    链接:https://ac.nowcoder.com/acm/contest/329/G来源:牛客网 题目描述 经过了选号和漫长的等待,处女座终于拿到了给小姐姐定制的手环,小姐姐看到以后直呼666! ...

  9. jquery.cookie介绍和用法

    1.依赖jQuery库 2.浏览器兼容性情况 3.下载 官方github:https://github.com/carhartl/jquery-cookie 4.使用 创建一个整站cookie $.c ...

  10. Bootstrap 导航元素(标签页)

    [Bootstrap 导航元素] 1.基本的导航元素:标签导航.基于ul.li而来,给ul添加 class="nav nav-tabs" 即可.选中的li添加 class=&quo ...