rest framework 序列化
阿新 • • 發佈:2019-01-15
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 序列化