serializers 序列化组件

  可以实现很轻松的互相转换,最常用的组件 ,用量最大的组件

源码位置

rest_framework.serializers

源码中需要用到的 

   rest_framework.serializers

# 序列化工具类必须要继承此类

class ModelSerializer(Serializer):

命令

  queryset/对象 -----> 序列化数据

bs=BookModelSerializers(queryset,many=True)    # 对queryset 对象序列化

bs=BookModelSerializers(obj)    # 对 对象序列化

  序列化数据 -----> queryset

bs=BookModelSerializers(data=request.data)    # 将序列化数据 转换成对象

  数据校验

bs.is_valid() 

  数据提交转换成记录

# 不指定对象.create() 方法
bs=BookModelSerializers(data=request.data)
bs.save() # 指定对象.updata() 方法
bs=BookModelSerializers(book,data=request.data)
bs.save()

实例

序列化模块工具类

  建立model字段的映射

  如果将所有的字段转换,转换一对多多对多字段的值会是关联的主键值,

  如果向显示关联的值就需要自定义,当 __all__ 和自定义字段都有的时候,优先使用自定义的 

  但是如果你使用了自定义的方法就需要重写 create方法。不然是报错无法正常的传输数据,因为默认的create是按照主键值来的。

序列化的定义

from rest_framework.response import Response
from rest_framework import serializers
class BookModelSerializers(serializers.ModelSerializer): # 类似于 modelform 一样的操作
class Meta:
    model = Book
    fields = "__all__"
    # fields = ['publist','authors','title',] # 也可以单独取部分字段     # 默认转换的时候普通字段没啥问题
    # title = serializers.CharField # 对于普通字段直接取即可 默认是 取 str(obj.title )     # 对于一对一,一对多字段会有错误的显示
    # publish= serializers.CharField() # 会显示对象
    # publish_id = serializers.CharField() # 会显示id ,如果没有非要要求显示特定字段,直接全部 __all__ 即可。
  
  
  # 自定义对一对多字段处理 ,注意啊:自定义字段可别写在 Meta 里面。是类下的变量字段。
  publish = serializers.CharField(source="publish.pk") # 加 "source=" 取 str(obj.publish.pk )
     # 给字段的赋值一个 url 地址 ,即 Hyperlinked
  publish=serializers.HyperlinkedIdentityField(
view_name="detailpublish", # 反向解析的 别名
lookup_field="publish_id", # 找出来当前的 id 值
lookup_url_kwarg="pk" # 将lookup_field 的值赋值给 url 中
)
  # 如果使用了超链接,url 的格式如下, 必须需要有 反向名字,分组命名。
  # url(r'publish/(?P<pk>\d+)', views.BookDetailView.as_view(),name="detailpublish"),   # 如果使用了超链接,序列化示例的时候必须要加 context={"request":request}参数。
  # bs=BookModelSerializers(book_list,many=True,context={'request': request})
  # authors = serializers.SerializerMethodField(source='authors.all')  # 这样查多对多会查出来 queryset 对象
  # 自定义对多对多字段的处理
  authors = serializers.SerializerMethodField()
  def get_authors(self,obj): # 自定义多对多的处理,方法名有要求: get_字段名字
    temp=[]
    for obj in obj.authors.all():
      temp.append(obj.name)
      return temp
  # 如果自定义了字段的处理 ,需要重写 create 方法
  def create(self, validated_data):
    book=Book.objects.create(
      title=validated_data["title"],
      price=validated_data["price"],
      pub_date=validated_data["pub_date"],
      publish_id=validated_data["publish"]["pk"]
    )
    book.authors.add(*validated_data["authors"])
    return book

序列化的使用

路由

url(r'book/', views.BookView.as_view()),
url(r'book/(\d+)', views.BookDetailView.as_view()),

视图

class BookView(APIView):
def get(self,request): # 对所有数据进行查看
book_list=Book.objects.all()
bs=BookModelSerializers(book_list,many=True,context={'request': request}) # 如果使用了了返回超链接就必须要加 context参数
return Response(bs.data)   def post(self,request): # 对数据进行创建提交
# post请求的数据
bs=BookModelSerializers(data=request.data)
if bs.is_valid():
print(bs.validated_data)
bs.save() # .create()方法
return Response(bs.data)
else:
return Response(bs.errors) class BookDetailView(APIView):
def get(self,request,id): # 对单条数据进行查看 book=Book.objects.filter(pk=id).first()
bs=BookModelSerializers(book,context={'request': request})
return Response(bs.data)   def put(self,request,id): # 对单条数据进行更新
book=Book.objects.filter(pk=id).first()
bs=BookModelSerializers(book,data=request.data)
if bs.is_valid():
bs.save() # .updata()
return Response(bs.data)
else:
return Response(bs.errors)   def delete(self,request,id): # 删除数据
    Book.objects.filter(pk=id).delete()
    return Response()

rest framework 序列化的更多相关文章

  1. Django REST Framework序列化器

    Django序列化和json模块的序列化 从数据库中取出数据后,虽然不能直接将queryset和model对象以及datetime类型序列化,但都可以将其转化成可以序列化的类型,再序列化. 功能需求都 ...

  2. rest framework 序列化之depth遇到用户表外键的尴尬情况

    rest framework 序列化之depth遇到用户表外键的尴尬情况 问题:ModelSerializer序列化使用depth=1直接扩表把用户表所有信息查询出来的情况 class xxxSeri ...

  3. [Django REST framework - 序列化组件、source、钩子函数]

    [Django REST framework - 序列化组件.source.钩子函数] 序列化器-Serializer 什么是rest_framework序列化? 在写前后端不分离的项目时: 我们有f ...

  4. Django REST framework序列化

    一.简介 Django REST framework是基于Django实现的一个RESTful风格API框架,能够帮助我们快速开发RESTful风格的API. 官网:https://www.djang ...

  5. Django Rest framework序列化流程

    目录 一 什么是序列化 二 Django REST framework配置流程之Serializer 三 Django REST framework配置流程之ModelSerializer 一 什么是 ...

  6. 02 Django REST Framework 序列化

    01-创建序列化类 # 方式一: publish_list = models.Publish.objects.all() # 导入序列化组件 from django.core import seria ...

  7. python学习-- Django REST framework 序列化数据操作

    一.为什么要返回json数据? 一般来说前端要用到从后台返回的数据来渲染页面的时候,这时候后台就需要向前端返回json类型的数据,简单直观便于理解 ,就类似于 {"xxx":{[& ...

  8. Django REST Framework 序列化和校验 知识点

    DRF序列化 Django ORM对象 --> JSON格式的数据 序列化 JSON格式的数据 --> Django ORM数据 反序列化 需要两个工具: from rest_framew ...

  9. django rest framework 序列化组件总结

    序列化组件总结 一. 序列化组件本质上为了实现前后端分离,而进行json序列化的一个组件形式,极大方便了解析数据的作用 二. 所有序列化是基于APIView 解析器实现的,通过内部的多继承关系方便实现 ...

随机推荐

  1. 驰骋工作流引擎JFlow与activiti的对比之2种取消模式

    1. 取消模式(Cancel Activity) 就是将某个活动取消. JFLOW中,类似与删除流程操作相同. 不能删除:不允许删除. 逻辑删除:仅仅将此流程标记为删除状态,数据仍然存在节点表单与流程 ...

  2. 【资源分享】ArcFace Demo [Android]

    虹软人脸识别引擎Android的Demo演示,可以直接下载使用. 下载地址: https://github.com/asdfqwrasdf/ArcFaceDemo readme: 工程如何使用? 下载 ...

  3. MongoDB 提升性能的18原则(开发设计阶段)

    MongoDB 是高性能数据,但是在使用的过程中,大家偶尔还会碰到一些性能问题.MongoDB和其它关系型数据库相比,例如 SQL Server .MySQL .Oracle 相比来说,相对较新,很多 ...

  4. Linux中DHCP服务器的简单配置

    我安装了两台linux系统,一个作为服务器,一个客户端 两个都有3个网卡, 后两个网卡聚合为zhi一个网卡:Linux 网卡聚合 两台电脑都一样. 那么如何为这个聚合网卡进行DHCP的分配呢? 1.由 ...

  5. MPP架构海量数据分析仓库——Greenplum介绍

    一.Greenplum背景 时间回到2002年,互联网行业经过近10年的发展,数据量正处于快速增长期: 1.传统的主机计算模式在海量数据面前,除了造价昂贵外,在CPU计算和IO吞吐上不能满足海量数据的 ...

  6. 一天一个Linux命令--dhclient

    dhclient -r #用于释放ip地址2 dhclient #获取IP地址 主要针对只有命令行的Linux机器,临时改变了网络环境,事先手动设置的ip地址 看一下自带的解释 root@ubuntu ...

  7. nginx内置变量总结

    nginx内置变量 2019-02-28 变量名称 变量用途 $atg_PARAMETER      客户端GET请求中   PARAMETER字段的值                        ...

  8. 交替方向乘子法(ADMM)

    交替方向乘子法(ADMM) 参考1 参考2 经典的ADMM算法适用于求解如下2-block的凸优化问题( 是最优值,令 表示一组最优解): Block指我们可以将决策域分块,分成两组变量, 这里面 都 ...

  9. Angular创建路由从主界面跳转到我们的cesium界面

    我们要在一个独立的顶级模块中加载和配置路由器,它专注于路由功能,然后由根模块 AppModule 导入它. 按照惯例,这个模块类的名字叫做 APPRoutingModule,并且位于 src/app  ...

  10. Python简单的多线程demo:常用写法

    简单多线程实现:启动50个线程,并计算执行时间. import threading import time def run(n): time.sleep(3) print("task:&qu ...