能夠實現很輕鬆的互相轉換,最經常使用的組件 ,用量最大的組件python
rest_framework.serializers
rest_framework.serializersapp
# 序列化工具類必需要繼承此類 class ModelSerializer(Serializer):
bs=BookModelSerializers(queryset,many=True) # 對queryset 對象序列化 bs=BookModelSerializers(obj) # 對 對象序列化
bs=BookModelSerializers(data=request.data) # 將序列化數據 轉換成對象
bs.is_valid()
# 不指定對象.create() 方法 bs=BookModelSerializers(data=request.data) bs.save() # 指定對象.updata() 方法 bs=BookModelSerializers(book,data=request.data) bs.save()
序列化模塊工具類工具
創建model字段的映射post
若是將全部的字段轉換,轉換一對多多對多字段的值會是關聯的主鍵值,url
若是向顯示關聯的值就須要自定義,當 __all__ 和自定義字段都有的時候,優先使用自定義的 spa
可是若是你使用了自定義的方法就須要重寫 create方法。否則是報錯沒法正常的傳輸數據,由於默認的create是按照主鍵值來的。rest
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 ,若是沒有非要要求顯示特定字段,直接所有 __all__ 便可。 # 自定義對一對多字段處理 ,注意啊:自定義字段可別寫在 Meta 裏面。是類下的變量字段。 publish = serializers.CharField(source="publish.pk") # 加 "source=" 取 str(obj.publish.pk )
# 給字段的賦值一個 url 地址 ,即 Hyperlinked publish=serializers.HyperlinkedIdentityField( view_name="detailpublish", # 反向解析的 別名 lookup_field="publish_id", # 找出來當前的 id 值 lookup_url_kwarg="pk" # 將lookup_field 的值賦值給 url 中 )
# 若是使用了超連接,url 的格式以下, 必須須要有 反向名字,分組命名。
# url(r'publish/(?P<pk>\d+)', views.BookDetailView.as_view(),name="detailpublish"),
# 若是使用了超連接,序列化示例的時候必需要加 context={"request":request}參數。
# bs=BookModelSerializers(book_list,many=True,context={'request': request})
# authors = serializers.SerializerMethodField(source='authors.all') # 這樣查多對多會查出來 queryset 對象 # 自定義對多對多字段的處理 authors = serializers.SerializerMethodField() def get_authors(self,obj): # 自定義多對多的處理,方法名有要求: get_字段名字 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
路由code
url(r'book/', views.BookView.as_view()), url(r'book/(\d+)', views.BookDetailView.as_view()),
視圖orm
class BookView(APIView): def get(self,request): # 對全部數據進行查看 book_list=Book.objects.all() bs=BookModelSerializers(book_list,many=True,context={'request': request}) # 若是使用了了返回超連接就必需要加 context參數 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()