REST framework(二) 序列化
程序员文章站
2022-04-27 11:36:14
...
序列化器允许将诸如查询集和模型实例之类的复杂数据转换为原生 Python 数据类型,然后可以将它们轻松地呈现为 JSON
,XML
或其他内容类型。序列化器还提供反序列化,在首次验证传入数据之后,可以将解析的数据转换回复杂类型。
REST framework 中的序列化类与 Django 的 Form
和 ModelForm
类非常相似。我们提供了一个 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请求得到所有数据
- 发送post请求添加单条数据
- 发送get请求查看单条数据
- 发送put请求修改某条记录中的内容
- 发送delete请求删除某条记
返回的序列化数据为空所以删除这条记录成功了!
推荐阅读
-
django rest framework 数据的查找、过滤、排序的示例
-
django rest framework之请求与响应(详解)
-
Django REST framework视图的用法
-
Python实现的序列化和反序列化二叉树算法示例
-
详解从Django Rest Framework响应中删除空字段
-
protobuf对象二进制序列化存储(详解)
-
19.DjangoRestFramework学习二之序列化组件、视图组件
-
Django REST Framework批量更新rest_framework_extensions
-
rest_framework -- 认证组件
-
Django Rest Framework之认证