rest framework 序列化

serializers 序列化組件

  能夠實現很輕鬆的互相轉換,最經常使用的組件 ,用量最大的組件python

源碼位置

rest_framework.serializers

源碼中須要用到的 

   rest_framework.serializersapp

# 序列化工具類必需要繼承此類

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字段的映射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()
相關文章
相關標籤/搜索