python_restframework(序列化)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于python_restframework(序列化)的主要内容,如果未能解决你的问题,请参考以下文章

什么是序列化? 如何实现(反)序列化 序列化的应用

什么是序列化? 如何实现(反)序列化 序列化的应用

什么是序列化? 如何实现(反)序列化 序列化的应用

什么是序列化? 如何实现(反)序列化 序列化的应用

如何序列化/反序列化的ArrayList

什么是java的序列化和反序列化?