1. 程式人生 > 其它 >drf : 序列化類使用many引數的作用,原始碼解析

drf : 序列化類使用many引數的作用,原始碼解析

序列化類使用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)