一、什麼是序列化組件? 本質上為了實現前後端分離,而進行json序列化的一個組件形式,極大方便瞭解析數據的作用 所有序列化是基於APIView解析器實現的,通過內部的多繼承關係方便實現進行數據序列化的實現 二、使用方法 第一步:創建序列化類 創建出返回頁面顯示的欄位,一對多關係同創建普通欄位一樣,無 ...
一、什麼是序列化組件?
本質上為了實現前後端分離,而進行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解析器實現的,通過內部的多繼承關係方便實現進行數據序列化的實現
二、使用方法