欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

REST framework(二) 序列化

程序员文章站 2022-04-27 11:36:14
...

​ 序列化器允许将诸如查询集和模型实例之类的复杂数据转换为原生 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<pk>\d+)/$',views.PublishDetailView.as_view()),
]

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

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

REST framework(二) 序列化

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

REST framework(二) 序列化

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

REST framework(二) 序列化

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

REST framework(二) 序列化

  • 发送delete请求删除某条记

REST framework(二) 序列化

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

相关标签: REST framework