序列化組建

薛才昌發表於2018-12-11

一、什麼是序列化元件?

   本質上為了實現前後端分離,而進行json序列化的一個元件形式,極大方便了解析資料的作用

     所有序列化是基於APIView解析器實現的,通過內部的多繼承關係方便實現進行資料序列化的實現

二、使用方法  

   1、基於APIView 引入 from rest_framework.views import APIView

  2、返回的請求用 Response:  from rest_framework.response import Response

  3、開始進行建立序列化類的方式:from rest_framework import serializers    

第一步:建立序列化類

建立出返回頁面顯示的欄位,一對多關係同建立普通欄位一樣,無需特意宣告關係,但需要引入:

source=publish.city

重新命名:用source :xx = serializers.CharField(source=`name`);將name命名為xx

第二步:建立需要解析的資料類,繼承APIView方法

建立 的方法要遵循rest請求規範

1、獲取需要傳遞的資料

2、將資料 傳到序列化類中,返回一個例項化物件

3、通過返回return Response(例項化物件.data)返回給頁面

檢視層(views.py)

from django.shortcuts import render

# Create your views here.

from app01 import models
from rest_framework.views import APIView
from app01.mySer import BookSerializer
from django.http import JsonResponse


class Books(APIView):
    def get(self, request, *args, **kwargs):
        ret = models.Book.objects.all()
        # 生成一個序列化的物件,傳引數
        # 序列化多條,記住 many=True
        book_ser = BookSerializer(ret, many=True)
        print(book_ser.data)
        return JsonResponse(book_ser.data, safe=False)

新建的py檔案

from rest_framework import serializersclass BookSerializer(serializers.Serializer):
    name = serializers.CharField()
    # 可以用source修改別名
    # xxx = serializers.CharField(source=`name`)
    price = serializers.CharField()
    # 可以用source拿出出版社內的各個欄位
    # publish=serializers.CharField(source=`publish.name`)
    # publish = serializers.CharField(source=`publish.city`)
    # 指定函式,test在models中
    test = serializers.CharField(source=`publish.test`)
    publish_id = serializers.CharField()
    # 拿出出版社的所有資訊
    # SerializerMethodField可以指定一個方法
    publish = serializers.SerializerMethodField()

    # 方法名:叫get_ 欄位名,要傳引數,引數是:當前book物件
    def get_publish(self, obj):
        # obj是當前book物件
        dic = {`name`: obj.publish.name, `email`: obj.publish.email}
        return dic

模板層(models)

from django.db import models


# Create your models here.

class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    publish_date = models.DateField()

    publish = models.ForeignKey(to=`Publish`, to_field=`nid`, on_delete=models.CASCADE)
    authors = models.ManyToManyField(to=`Author`)

    def __str__(self):
        return self.name


class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    author_detail = models.OneToOneField(to=`AuthorDatail`, to_field=`nid`, unique=True, on_delete=models.CASCADE)


class AuthorDatail(models.Model):
    nid = models.AutoField(primary_key=True)
    telephone = models.BigIntegerField()
    birthday = models.DateField()
    addr = models.CharField(max_length=64)


class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
    email = models.EmailField()

    def __str__(self):
        return self.name

    def test(self):
        return self.email

拿出這本書的所有作者(在新建的py檔案 中)

# 寫作者序列化的類
class AuthorSerializer(serializers.Serializer):
    nid = serializers.CharField()
    name = serializers.CharField()
    age = serializers.CharField()


class BookSerializer(serializers.Serializer):

  authors = serializers.SerializerMethodField()

    #方法一
    def get_authors(self, book):
        # 拿出這本書的所有作者
        aus = book.authors.all()
        # 拼出一個列表,列表中套字典 ,每個字典是一個作者
        l1 = []
        for i in aus:
            l1.append({`name`: i.name, `age`: i.age})
        return l1

    # 方法二
    def get_authors(self,book):
        aus=book.authors.all()
        # 可以繼續用序列化類,來處理
        auth_ser=AuthorSerializer(aus,many=True)
        return auth_ser.data

 

# class BookSerializer(serializers.ModelSerializer):
#     # 必須寫一個內部類,名字叫 Meta
#     class Meta:
#         # 查詢Book該表中的所有欄位
#         model = Book
#         fields = `__all__`
#         # 重寫屬性
#     publish = serializers.CharField(source=`publish.name`)
#     authors = serializers.SerializerMethodField()
#
#     def get_authors(self, book):
#         aus = book.authors.all()
#         # 可以繼續用序列化類,來處理
#         auth_ser = AuthorSerializer(aus, many=True)
#         return auth_ser.data




class BookSerializer(serializers.ModelSerializer):
    # 必須寫一個內部類,名字叫 Meta
    class Meta:
        # 查詢Book該表中的所有欄位
        model = Book
        # fields = `__all__`
        # 指定取出的欄位
        fields = [`nid`, `authors`]


        # 去掉指定的欄位
        exclude = [`publish`, `name`]
        # 重寫屬性
        # 指定深度(官方建議小於10,個人建議小於3)
        # depth=1

 

 

 

 本質上為了實現前後端分離,而進行json序列化的一個元件形式,極大方便了解析資料的作用
所有序列化是基於APIView解析器實現的,通過內部的多繼承關係方便實現進行資料序列化的實現
二、使用方法

相關文章