python_restframework(序列化)

django自带的序列化工具serializers

三步骤

  1. 导入 from django.core import serializers
  2. 生成对象并传参 response = serializers.serialize(‘json‘, book_list)
    • 第一个json是解析器,说明要解析成json格式的字符串,
    • 第二个是queryset对象,
  3. 最后返回结果 return JsonResponse(response, safe=False)
    • safe 为false说明不是正经的json格式,里面有可能套了列表 元组以及其它的格式字符串
from app01 import models
from django.shortcuts import render, HttpResponse
from django.core import serializers
from django.http import JsonResponse
from rest_framework.views import APIView

class BookManage(APIView):
    def get(self, request, *args, **kwargs):
        book_list = models.Book.objects.all()
        # serialize(format, queryset, **options)
        #            格式, 传queryset对象, 其它选项
        response = serializers.serialize(‘json‘, book_list)
        # safe=False 如果不设置这个 当字典中还有其它的 如列表,返回就会报错
        return JsonResponse(response, safe=False)

如下图, 字典中的字段无用的就太多了会给网络带来拥堵

drf的Serializer的简单使用

三步骤

  1. 导入 from rest_framework import serializers
  2. 写一个类,继承 serializers.Serializer
    • class BookSerializers(serializers.Serializer)
  3. 类的方法中生成对象 bsl = BookSerializers(instance=book_list, many=True)
    • many=true 说明queryset对象中有多条,
    • many=false 说明字典中只有一条数据
from app01 import models
from django.shortcuts import render, HttpResponse
from django.http import JsonResponse
from rest_framework.views import APIView
from rest_framework import serializers

# Create your views here.

class BookSerializers(serializers.Serializer):
    # 必须要注意的是  这个序列化组件的值 必须是序列化中字典中存在的值!!
    name = serializers.CharField()
    price = serializers.DecimalField(max_digits=5, decimal_places=2)

class BookManage(APIView):
    def get(self, request, *args, **kwargs):
        book_list = models.Book.objects.all()

        # 初始化方法 def __init__(self, instance=None, data=empty, **kwargs)
        # many 如果传true就说明有多条,   kwargs.pop(‘many‘, None)
        # many 传false说明就只有一条字典
        bsl = BookSerializers(instance=book_list, many=True)
        return JsonResponse(bsl.data, safe=False)

[{"name": "1111", "price": "11.11"}, {"name": "2222", "price": "22.22"}]

如果不想要其中的一个结果, 直接在serializers中注释或删除即可
# name = serializers.CharField()   注释它之后
[{"price": "11.11"}, {"price": "22.22"}, {"price": "33.33"}, {"price": "44.44"}]

drs下的Serializer下的方法

source属性

  1. 更改前台查看的名称 source="name"

    class BookSer(serializers.Serializer):
       bookname = serializers.CharField(source="name")
    前台中的字典就会将name更改成为  "bookname": "python",
  2. 多表操作
    1. 表模型中添加 __str__

      当前台字典直接以对象的结果返回时,后台只需要 更改source
      "publish": "Publish object (2)"
      models对应的模型添加
        def __str__(self):
            return self.name
    2. 使用source 指定字段
      指字表模型中存在的段,   这个publish如果有source之后就可以随意更改
      publish = serializers.CharField(source=‘publish.city‘)
      source="publish.city" 最终查询是   book.publish.city 进行查询
    3. 表模型中添加 使用一个方法
      在返回对象的表模型中添加一个方法, 然后在serializers中用source 直接查询
        def get_city(self):
            return self.city
      
      publish = serializers.CharField(source=‘publish.get_city‘)

SerializerMethodField

  1. 自定义方法

    authors = serializers.SerializerMethodField()
    
    # 需要传一个参数, 其实就是后台views传过来的 返回结果book_obj
    #  msg = BookSer(book_obj, many=True)
    def get_authors(self, book):
       msg = [{"author_name": author.name, "age": author.age} for author in book.authors.all()]
       return msg
    
       # 列表生成式, 返回的结果就是
       {"publish":"xx出版社",
       "authors": [
        {"name":"xx",
        "age":11}]
       }
  2. 直接将查询的结果 序列化
    class Authors(serializers.Serializer):
       name = serializers.CharField()
       age = serializers.IntegerField()
    
    class BookSer(serializers.Serializer):
       #  使用 SerializerMethodField 可以指定一个方法
       authors = serializers.SerializerMethodField()
       def get_authors(self, book):
           auth_obj = book.authors.all()
           msg = Authors(auth_obj, many=True)
           return msg.data
    # 结果与列表生成式的一样

drs下的ModelSerializer

fields方法

  1. 获取全部的

    # 这个表下所有的字段都会在前台展示
    class BookSer(serializers.ModelSerializer):
       # 这个是固定格式
       class Meta:
           model = models.Book
           fields = "__all__"
  2. 类似于白名单
    class BookSer(serializers.ModelSerializer):
       # 这个是固定格式
       class Meta:
           model = models.Book
           fields = ["nid","publish"]    # 只要这两个
       # 如果写了自定义的值,那么这个名称就需要与fields中定义的一样
       publish = serializers.CharField(source="publish.name")
  3. 类似于黑名单,过滤, 不能与fields同时存在
    class BookSer(serializers.ModelSerializer):
       # 这个是固定格式
       class Meta:
           model = models.Book
           exclude = ["authors"]  # 过滤掉它
  4. 查询深度
    class BookSer(serializers.ModelSerializer):
       # 这个是固定格式
       class Meta:
           model = models.Book
           fields = "__all__"
            # 官方建议是不要超过10的深度, 一层一层的查询,  实际中使用最好不要超过3层
           depth = 1
    
    sqlite 如果有时间那么查询的话,会有超长的错误提示

Meta下的方法

  1. 重写方法

    # 这个表下所有的字段都会在前台展示
    class BookSer(serializers.ModelSerializer):
       # 这个是固定格式
       class Meta:
           model = models.Book
           fields = "__all__"
           # 重写方法  在Meta下
           publish = serializers.CharField(source="publish.name")
  2. 也可以用序列化的方式
    authors = serializers.SerializerMethodField()
    def get_authors(self, obj):
       auth = obj.authors.all()
       msg = Authors(auth, many=True)
       return msg.data

原文地址:https://blog.51cto.com/xiong51/2395181

时间: 2024-08-30 18:34:14

python_restframework(序列化)的相关文章

Day4 - 迭代器&生成器、装饰器、Json & pickle 数据序列化、软件目录结构规范

---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 需求:列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求把列表里的每个值加1 1 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 b = [] 3 for i in a: 4 b.append(i+1) 5 a = b 6 print(a) 普通青

C#中XML与对象之间的序列化、反序列化

using System; using System.IO; using System.Text; using System.Xml; using System.Xml.Serialization; namespace Xml.Utility { public static class XmlUtil { /// <summary> /// 将一个对象序列化为XML字符串 /// </summary> /// <param name="o">要序列化

二叉树的序列化和反序列化

http://blog.csdn.net/qq_27703417/article/details/70958692 先序遍历二叉树,如果遇到空节点,就在str的末尾加上"#!","#"表示这个节点为空,节点值不存在,当然你也可以用其他的特殊字符,"!"表示一个值的结束.如果遇到不为空的节点,假设节点值为3,就在str的末尾加上"3!".现在请你实现树的先序序列化. 先序遍历 import java.util.*; //使用递归

Java复习——I/O与序列化

File类 java.io.File只用于表示文件(目录)的信息(名称.大小等),不能用于文件内容的访问,我们可以通过通过给其构造函数传一个路径来构建以文件,传入的路径名有一个小问题,就是Windows和UNIX 中的路径分隔符斜杠方向的问题:"/" 表示 UNIX 中的根目录,"\" 表示Windows 的根目录.File类有静态的参数可以很简单的解决这个问题:pathSeparator就是其中一个.File类中常用的方法有: exists():测试此抽象路径名表

Java 深拷贝浅拷贝 与 序列化

一.浅拷贝.深拷贝 浅拷贝会对对象中的成员变量进行拷贝:如果是基本类型,拷贝的就是基本类型的值:如果属性是内存地址(引用类型),拷贝的就是内存地址 : 深拷贝,除了基本类型外,引用类型所引用的对象也会进行拷贝:(引用的对象只要求浅拷贝即可:若要深层拷贝,一般可利用序列化和反序列化来实现,也可手动实现各级引用对象的深层拷贝:) 二.实现: 浅拷贝:实现Cloneable接口,重写clone()方法,在clone()调用父类super.clone()即可: 深拷贝:1. 实现Cloneable接口,

PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

  前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象类与抽象方法 1.什么是抽象方法?              没有方法体 {} 的方法,必须使用abstract 关键字修饰.这样的方,我们叫做抽象方法.                    abstract function say(); //    抽象方法 2.什么是抽象类?        

序列化与反序列化

对象的序列化,反序列化 1)对象序列化,就是将Object转化为byte序列,反之叫对象的反序列化 2)序列化流(ObjectOutputStream),是过滤流----writeObject() 反序列化流(ObjectInputStream)------readObject() 3)序列化接口(Serializable) 对象必须实现序列化接口,才能进行序列化,否则将出现异常 这个接口,没有任何方法,只是一个标准

NET(C#):XmlArrayItem特性和XmlElement特性在序列化数组的差别

https://www.mgenware.com/blog/?p=142 比如这样一个类,我们用XmlArrayItem特性标明数组内出现的元素类型: public class a{ [XmlArrayItem(Type = typeof(int)), XmlArrayItem(Type = typeof(Guid)), XmlArrayItem(Type = typeof(string))] public object[] arr = new object[] { 12, "hehe"

java 实现序列化的两种方式

序列化是把java对象以字节流的形式写入硬盘或传给网络中的其他计算机. 方式一:实现Serializable借口.该接口是一个空借口,仅用于标识该对象可以被序列化,以便jre对其做封装. 方式二:实现Externalizable借口.该接口继承自Serializable借口,添加了两个方法 writeExternal()/readExternal(),在writeExternal()方法中可以指定需要序列化的属性,实现部分序列化