一、什麼是序列化元件?
本質上為了實現前後端分離,而進行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解析器實現的,通過內部的多繼承關係方便實現進行資料序列化的實現
二、使用方法