REST framework(二) 序列化

​ 序列化器允许将诸如查询集和模型实例之类的复杂数据转换为原生 Python 数据类型,然后可以将它们轻松地呈现为 JSONXML 或其他内容类型。序列化器还提供反序列化,在首次验证传入数据之后,可以将解析的数据转换回复杂类型。

​ REST framework 中的序列化类与 Django 的 FormModelForm 类非常相似。我们提供了一个 Serializer 类,它提供了一种强大的通用方法来控制响应的输出,以及一个 ModelSerializer 类,它为创建处理模型实例和查询集的序列化提供了有效的快捷方式。

自定义序列化组件(了解)

    class BookSerializers(serializers.Serializer):
        title=serializers.CharField()
        price=serializers.CharField()
        publishDate=serializers.DateField()
        #   针对一对多
        publish=serializers.CharField(source="publish.name")
        publish_email=serializers.CharField(source="publish.email")
        #   针对多对多
        authors=serializers.SerializerMethodField()
        def get_authors(self,obj):
            data=[]
            for i in obj.authors.all():
                temp=[]
                temp.append(i.pk)
                temp.append(i.name)
                data.append(temp)
            return data 

现在我们使用REST framework给我们提供的ModelSerializer序列化组件

app01下serializers.py

from rest_framework import serializers
from app01.models import *
#ModelSerializer拥用校验字段与操作记录的功能
class PublishSerializers(serializers.ModelSerializer):
    class Meta:
        model=Publish
        fields="__all__"

​ app01下的views.py

from django.shortcuts import render,HttpResponse

# Create your views here.

from app01.models import *
from rest_framework.views import APIView
from django.core.serializers import serialize
from rest_framework.response import Response
from app01.serializers import *
class PublishView(APIView):
    #查看所有的数据接口
    def get(self,request):
        publish_list=Publish.objects.all()
        #django的序列化组件
        # ret=serialize('json',publish_list)
        # return HttpResponse(ret)
        # REST的序列化组件
        ps=PublishSerializers(publish_list,many=True)
        return  Response(ps.data)  # 序列化接口  
    #增加提交一个数据
    def post(self,request):
        ps = PublishSerializers(data=request.data)
        if ps.is_valid():  # 校验字段接口
            ps.save()  # 生成记录接口
            return Response(ps.data)  # 序列化接口   
        else:
            return Response(ps.errors)

class PublishDetailView(APIView):
    #查看单个数据
    def get(self,request,pk):
        publish_obj=Publish.objects.filter(pk=pk).first()
        ps=PublishSerializers(publish_obj,many=False)
        return Response(ps.data)

    #修改
    '''在反序列化数据时,需要在尝试访问验证数据之前调用 is_valid(),或者保存对象实例。如果发生任何验证错误,那么 .errors 属性将包含一个代表错误消息的字典'''
    def put(self,request,pk):
        publish_obj=Publish.objects.filter(pk=pk).first()
        ps=PublishSerializers(data=request.data,instance=publish_obj)
        if ps.is_valid():  # 校验字段接口
            ps.save()  # 更新记录接口
            return Response(ps.data)  # 序列化接口   
        else:
            return Response(ps.errors)  # 序列化接口 
    #删除
    def delete(self,request,pk):
        Publish.objects.filter(pk=pk).delete()
        return Response('')

urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^publish/$',views.PublishView.as_view()),
    url(r'^publish/(?P\d+)/$',views.PublishDetailView.as_view()),
]

现在我们可以用Postman来模拟向后端发送请求,得到序列化的数据

  • 发送get请求得到所有数据

REST framework(二) 序列化_第1张图片

  • 发送post请求添加单条数据

REST framework(二) 序列化_第2张图片

  • 发送get请求查看单条数据

REST framework(二) 序列化_第3张图片

  • 发送put请求修改某条记录中的内容

REST framework(二) 序列化_第4张图片

  • 发送delete请求删除某条记

REST framework(二) 序列化_第5张图片

返回的序列化数据为空所以删除这条记录成功了!

你可能感兴趣的:(REST,framework,Django,REST,framework)