码迷,mamicode.com
首页 > 其他好文 > 详细

rest framework 序列化

时间:2019-01-15 19:09:27      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:提交   一个   block   api   any   pre   save   meta   date   

 

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 序列化

标签:提交   一个   block   api   any   pre   save   meta   date   

原文地址:https://www.cnblogs.com/shijieli/p/10273584.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!