• drf 之序列化组件


    序列化

      把Python中对象转换为json格式字符串

    反序列化

      把json格式转为为Python对象。

    用orm查回来的数据都是都是一个一个的对象, 但是前端要的是json格式字符串。

    序列化两大功能:

      对请求数据进行验证

      对Queryset对象进行序列化

    一、Django自带序列化组件

      略

    二、rest framework序列化之Serializer

    使用方式如下:

    建表 models.py

    from django.db import models
    
    # Create your models here.
    
    
    class Book(models.Model):
        title=models.CharField(max_length=32)
        price=models.IntegerField()
        pub_date=models.DateField()
        publish=models.ForeignKey("Publish")
        authors=models.ManyToManyField("Author")
        def __str__(self):
            return self.title
    
    class Publish(models.Model):
        name=models.CharField(max_length=32)
        email=models.EmailField()
        def __str__(self):
            return self.name
    
    class Author(models.Model):
        name=models.CharField(max_length=32)
        age=models.IntegerField()
        def __str__(self):
            return self.name

    views

    写一个restframework接口拿到数据(所有图书)

    方式一:如果没有序列化组件的话,要先转成字典,然后再用json.dumps()再转。

    方式二:用序列化组件。

    首先你要序列化谁,先写一个类。这个类继承一个东西,然后用的时候,在视图类中直接用这个类生成一个对象。

    from django.shortcuts import render,HttpResponse
    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    # Create your views here.
    
    from api import models
    
    # 想用这个类,需要导入
    from api.MySerializer import BookSerializer
    
    class BookView(APIView):
    
        def get(self,request,*args,**kwargs):
            ret = {
                'code':100,
                'msg':'成功了'
            }
            books = models.Book.objects.all()
            # 第一个参数是要序列化的对象,如果序列化多条,必须指定many=True
            books_ser = BookSerializer(instance=books,many=True)
            # 当序列化的对象是单个对象的时候many=False book = models.Book.objects.all().first()
            # books_ser.data  就是序列化后的结果 是个字典
            print(books_ser.data)
            ret['books']=books_ser.data
            # return Response(books_ser.data)
            return Response(ret)

    写的格式化的类在另外的文件夹或文件:

    # 自己写一个序列化的类
    from rest_framework import serializers
    class BookSerializer(serializers.Serializer):
        # 序列化哪个字段,必须跟数据库字段一样,都想序列化就一个一个排着写
        id = serializers.CharField()
        title = serializers.CharField()
        price = serializers.CharField()

    在线格式化json

    https://www.json.cn

    获取一本id为3的书  http://127.0.0.1:8000/book/3

    路由:

    from api import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^books/$', views.BookView.as_view()),
        url(r'^book/(?P<id>d+)$', views.Book.as_view()),
    ]

    视图:

    from django.shortcuts import render,HttpResponse
    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    # Create your views here.
    
    from api import models
    
    # 想用这个类,需要导入
    from api.MySerializer import BookSerializer
    
    class BookView(APIView):
    
        def get(self,request,*args,**kwargs):
            ret = {
                'code':100,
                'msg':'成功了'
            }
            books = models.Book.objects.all()
            # 第一个参数是要序列化的对象,如果序列化多条,必须指定many=True
            books_ser = BookSerializer(instance=books,many=True)
            # 当序列化的对象是单个对象的时候many=False book = models.Book.objects.all().first()
            # books_ser.data  就是序列化后的结果 是个字典
            print(books_ser.data)
            ret['books']=books_ser.data
            # return Response(books_ser.data)
            return Response(ret)
    
    
    class Book(APIView):
        def get(self,requst,id):
            ret = {
                'code': 100,
                'msg': '成功了'
            }
    
            book = models.Book.objects.filter(pk=id).first()
            book_ser = BookSerializer(instance=book,many=False)
            ret['book']=book_ser.data
            return Response(book_ser.data)

    如果序列化加个publish字段  (外键关联的)

    拿到的是  "publish": "Publish object" 

    如果想显示出版社的名字,拿到出版社的id 

    可以通过source来改名!

      变量名和source指定的值不能一样。

      source还支持继续点(字段)还支持方法

    序列化的类:

    # 自己写一个序列化的类
    from rest_framework import serializers
    class BookSerializer(serializers.Serializer):
        # 序列化哪个字段,必须跟数据库字段一样,都想序列化就一个一个排着写
        id = serializers.CharField()
    
    
        # title = serializers.CharField()
        name = serializers.CharField(source='title')
    
        price = serializers.CharField()
    
        publish_name = serializers.CharField(source='publish.name')
        publish_id = serializers.CharField(source='publish.pk')

    拿出出版社所有的东西:SerializerMethodField()

    意思是支持SerializerMethodField()这个方法,并且把返回值赋值给字段

    固定写法:get_这个字段名字,里面有个参数obj,这个obj就是当前对象。

    # 自己写一个序列化的类
    from rest_framework import serializers
    class BookSerializer(serializers.Serializer):
        # 序列化哪个字段,必须跟数据库字段一样,都想序列化就一个一个排着写
    
    
        publish_dic = serializers.SerializerMethodField()
    
        def get_publish_dic(self, obj):
            #意思是支持SerializerMethodField()这个方法,并且把返回值赋值给publish_dic
            return {'id':obj.publish.pk,'name':obj.publish.name,'email':obj.publish.email}

    多对多的表关系:  

  • 相关阅读:
    Spring配置文件命名空间
    JSTL之数字、日期格式化<fmt:formatNumber/>、<fmt:formatDate/>
    获取真实ip
    DES
    MD5
    手动导入maven包
    windows下redis主从复制设置
    linux系统上传图片读取权限设置
    linux系统项目查看进程
    linux上服务起的很慢解决方式
  • 原文地址:https://www.cnblogs.com/zhangrenguo/p/10507156.html
Copyright © 2020-2023  润新知