zoukankan      html  css  js  c++  java
  • rest framework 序列化

    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()
  • 相关阅读:
    Qt Qwt之坐标轴移动
    Lnux 16.04 VM下安装与汉化
    【学习笔记】开源日志记录工具log4j使用方法
    【学习笔记】关于DOM4J:使用DOM4J解析XML文档
    DOM的概念和简单应用:使用DOM解析XML数据
    初识Socket通信:基于TCP和UDP协议学习网络编程
    java 中的Scanner
    跟着前辈学编程
    集合应用案例:编写程序实现学生信息管理系统的录入登录
    简单Java程序向实用程序的过度:二进制文件的读写
  • 原文地址:https://www.cnblogs.com/shijieli/p/10273584.html
Copyright © 2011-2022 走看看