drf : 序列化類使用many引數的作用,原始碼解析
阿新 • • 發佈:2022-04-01
序列化類使用many引數的作用
views.py
from rest_framework.views import APIView from .serizlizer import BookSerializers from rest_framework.response import Response from .models import Books class BookView(APIView): def post(self, request): print(request) ser = BookSerializers(data=request.data) if ser.is_valid(): ser.save() return Response(ser.data) def get(self, request): book_list = Books.objects.all() # many=True 代表序列化多條資料 ser = BookSerializers(instance=book_list, many=True) """ <class 'rest_framework.serializers.ListSerializer'> ser 是ListSerializer的物件 """ print(type(ser)) # 這一步才是真正將book_list轉為字典並返回。調ser.data才是真正的序列化過程 return Response(ser.data) # 查詢單條 class BookDetailView(APIView): def get(self, request, pk): book = Books.objects.filter(pk=pk).first() # 不傳many預設為,many=False ser = BookSerializers(instance=book) """ <class 'app01.serizlizer.BookSerializers'> ser是BookSerializers的物件 """ print(type(ser)) # 這一步才是真正將book_list轉為字典並返回。調ser.data才是真正的序列化過程 return Response(ser.data)
這裡涉及到元類的知識。
類也是一個物件,一切皆物件。類這個物件也是一個類例項化得到的,這個類就叫做元類。
物件是例項化的得到的,類也是一個物件,BookSerializers這個類也是一個物件,既然是物件,那麼也會有類,類的類就叫元類。
所以,類也是由一個了類產生的,產生這個類的類就叫元類。
物件的產生過程有__new__
所控制
注意:物件的例項化過程,__new__
在__init__
之前執行,__new__
是產生空物件,__init__
給物件賦值。
那麼ListSerializer 和 BookSerializer 有什麼聯絡。?
ListSerializer就是一個列表,列表套了一個個的Serializer。[ser1,ser2,ser3...]
# 查詢單條 class BookDetailView(APIView): def get(self, request, pk): book = Books.objects.filter(pk=pk).first() # 不傳many預設為,many=False ser = BookSerializers(instance=book) """ <class 'app01.serizlizer.BookSerializers'> ser是BookSerializers的物件 """ print(type(ser)) """ BookSerializers(instance=<Books: Books object (1)>): id = IntegerField(label='ID', read_only=True) name = CharField(max_length=32) price = IntegerField() publish = PrimaryKeyRelatedField(allow_null=True, queryset=Publish.objects.all(), required=False) """ print(ser) # 這一步才是真正將book_list轉為字典並返回。調ser.data才是真正的序列化過程 return Response(ser.data)