rest framework 序列化
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                rest framework 序列化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                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) bs.save()# 指定對象.updata() 方法 bs=BookModelSerializers(book,data=request.data) bs.save()?
實例
序列化模塊工具類
建立model字段的映射
如果將所有的字段轉換,轉換一對多多對多字段的值會是關聯的主鍵值,
如果向顯示關聯的值就需要自定義,當 __all__ 和自定義字段都有的時候,優先使用自定義的?
但是如果你使用了自定義的方法就需要重寫 create方法。不然是報錯無法正常的傳輸數據,因為默認的create是按照主鍵值來的。
序列化的定義
from rest_framework.response import Response from rest_framework import serializers class BookModelSerializers(serializers.ModelSerializer): # 類似于 modelform 一樣的操作 class Meta:model = Bookfields = "__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
序列化的使用
路由
url(r'book/', views.BookView.as_view()), url(r'book/(\d+)', views.BookDetailView.as_view()),?
視圖
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()?
轉載于:https://www.cnblogs.com/shijieli/p/10273584.html
總結
以上是生活随笔為你收集整理的rest framework 序列化的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: ansible基础配置
- 下一篇: Travis CI + github +
