1. 程式人生 > >rest framework 序列化

rest framework 序列化

ret request delet save append ide post請求 api 輕松

serializers 序列化組件

  可以實現很輕松的互相轉換,最常用的組件 ,用量最大的組件

源碼位置

rest_framework.serializers

  

源碼中需要用到的

  rest_framework.serializers

# 序列化工具類必須要繼承此類
class ModelSerializer(Serializer):

  


轉換命令

  queryset/對象 -----> 序列化數據

bs=BookModelSerializers(queryset,many=True)    # 對queryset 對象序列化
bs=BookModelSerializers(obj)    # 對 對象序列化

  

  序列化數據 -----> queryset

bs=BookModelSerializers(data=request.data)    # 將序列化數據 轉換成對象

  

  數據校驗

bs.is_valid() 

  

  數據提交轉換成記錄

# 不指定對象.create() 方法
bs=BookModelSerializers(data=request.data)    

# 指定對象.updata() 方法
bs=BookModelSerializers(book,data=request.data)
bs.save()

  

實例

序列化模塊工具類

  建立model字段的映射

  自定義 oto fk mtm 字段

from rest_framework.response import Response
from rest_framework import serializers
class BookModelSerializers(serializers.ModelSerializer): # 類似於 modelform 一樣的操作 
    class Meta:
        model = Book
        fields = "__all__"
 # fields = [‘publist‘,‘authors‘,‘title‘,] # 也可以單獨取部分字段
# 默認轉換的時候普通字段沒啥問題
        # title  = serializers.CharField  # 對於普通字段直接取即可    默認是 取 str(obj.title ) 
        # 對於一對一,一對多字段會有錯誤的顯示
        # publish= serializers.CharField()  # 會顯示對象
    # publish_id = serializers.CharField()  # 會顯示id 
 
# 自定義對一對多字段處理 
    publish = serializers.CharField(source="publish.pk")  # 加 "source=" 取 str(obj.publish.pk )
    # 給字段的賦值一個 url 地址 
    publish=serializers.HyperlinkedIdentityField(
            view_name="detailpublish",    # 反向解析的 別名 
            lookup_field="publish_id",    # 找出來當前的 id 值 
            lookup_url_kwarg="pk"        # 將lookup_field 的值賦值給 url 中
        )
    # authors = serializers.SerializerMethodField(source=‘authors.all‘)  # 這樣查多對多會查出來 queryset 對象

# 自定義對多對多字段的處理
    authors = serializers.SerializerMethodField()  
    def get_authors(self,obj):                        # 自定義多對多的處理 
         temp=[]
         for obj in obj.authors.all():
             temp.append(obj.name)
         return temp 
    # 如果自定義了字段的處理 ,需要重寫 create 方法
    def create(self, validated_data):                 
        book=Book.objects.create(title=validated_data["title"],price=validated_data["price"],pub_date=validated_data["pub_date"],publish_id=validated_data["publish"]["pk"])
        book.authors.add(*validated_data["authors"])
        return book

  

  

序列化使用

class BookView(APIView):
    def get(self,request):        # 對所有數據進行查看
        book_list=Book.objects.all()
        bs=BookModelSerializers(book_list,many=True,context={‘request‘: request})
        return Response(bs.data)
    
  def post(self,request):        # 對數據進行創建提交 
        # post請求的數據
        bs=BookModelSerializers(data=request.data)
        if bs.is_valid():
            print(bs.validated_data)
            bs.save()    # .create()方法
            return Response(bs.data)
        else:
            return Response(bs.errors)


class BookDetailView(APIView):
    def get(self,request,id):    # 對單條數據進行查看

        book=Book.objects.filter(pk=id).first()
        bs=BookModelSerializers(book,context={‘request‘: request})
        return Response(bs.data)

  def put(self,request,id): # 對單條數據進行更新
        book=Book.objects.filter(pk=id).first()
        bs=BookModelSerializers(book,data=request.data)
        if bs.is_valid():
            bs.save()     # .updata()
            return Response(bs.data)
        else:
            return Response(bs.errors)
    
  def delete(self,request,id):    # 刪除數據 
    Book.objects.filter(pk=id).delete()
    return Response()

  

rest framework 序列化