天翼云主机 网站服务器,打开网站无反应怎么做,四川省建设工程质量监理协会网站,代码做网站的软件作用:
1. 序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串 2. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型 3. 反序列化,完成数据校验功能 定义序列化器 Django REST framework中的Serializer使用类来定义须继承自rest_framework.serializers.Serializer。 接下来为了方便演示序列化器的使用我们先创建一个新的子应用sers python manage.py startapp sers from django.db import models# Create your models here.class Book(models.Model):title models.CharField(max_length32,verbose_name书籍名称)price models.IntegerField(verbose_name价格)pub_date models.DateField(verbose_name出版日期) 我们想为Book模型类提供一个序列化器可以定义如下 from rest_framework import serializersclass BookSerializer(serializers.Serializer):title serializers.CharField()price serializers.IntegerField()pub_date serializers.DateField() 注意serializer不是只能为数据库模型类定义也可以为非数据库模型类的数据定义。serializer是独立于数据库之外的存在。 创建Serializer对象 定义好Serializer类后就可以创建Serializer对象了。 Serializer的构造方法为Serializer(instanceNone, dataempty, **kwarg) 说明 用于序列化时将模型类对象传入instance参数 用于反序列化时将要被反序列化的数据传入data参数 除了instance和data参数外在构造Serializer对象时还可通过context参数额外添加数据如 serializer AccountSerializer(account, context{request: request}) 通过context参数附加的数据可以通过Serializer对象的context属性获取。 使用序列化器的时候一定要注意序列化器声明了以后不会自动执行需要我们在视图中进行调用才可以。 序列化器无法直接接收数据需要我们在视图中创建序列化器对象时把使用的数据传递过来。 序列化器的字段声明类似于我们前面使用过的表单系统。 开发restful api时序列化器会帮我们把模型数据转换成字典. drf提供的视图会帮我们把字典转换成json,或者把客户端发送过来的数据转换字典. 序列化器的使用 序列化器的使用分两个阶段 处理客户端请求时使用序列化器可以完成对数据的反序列化。 处理服务器响应时使用序列化器可以完成对数据的序列化。 序列化 基本序列化 先查询出一个学生对象 from sers.models import Book
book Book.objects.get(pk1) 构造序列化器对象 from .serializers import BookSerializer
bookSer BookSerializer(instancebook) 获取序列化数据,通过data属性可以获取序列化后的数据路由 # urls.py
path(sers/, include(sers.urls)),
# sers.urls
path(books/(\d), BookView.as_view()), 视图 from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Book
from .sers import BookSerializerclass BookView(APIView):def get(self, request,id):book Book.objects.get(pkid)bs BookSerializer(instancebook)return Response(bs.data) 如果要被序列化的是包含多条数据的查询集QuerySet可以通过添加manyTrue参数补充说明 class BookView(APIView):def get(self, request):# book Book.objects.get(pk1)books Book.objects.all()bs BookSerializer(instancebooks, manyTrue)return Response(bs.data) 反序列化 数据验证 使用序列化器进行反序列化时需要对数据进行验证后才能获取验证成功的数据或保存成模型类对象。 在获取反序列化的数据前必须调用is_valid()方法进行验证验证成功返回True否则返回False。 验证失败可以通过序列化器对象的errors属性获取错误信息返回字典包含了字段和字段的错误。如果是非字段错误可以通过修改REST framework配置中的NON_FIELD_ERRORS_KEY来控制错误字典中的键名。 验证成功可以通过序列化器对象的validated_data属性获取数据。 在定义序列化器时指明每个字段的序列化类型和选项参数本身就是一种验证行为。 通过构造序列化器对象并将要反序列化的数据传递给data构造参数进而进行验证。 from sers.sers import BookSerializer
bs BookSerializer(data{title:小王子,price:100})
bs.is_valid() # 必须先要is_valid,才会有bs.validated_data和bs.errors
False
bs.validated_data
{}
bs.errors
{pub_date: [ErrorDetail(stringThis field is required., coderequired)]} is_valid()方法还可以在验证失败时抛出异常serializers.ValidationError可以通过传递raise_exceptionTrue参数开启REST framework接收到此异常会向前端返回HTTP 400 Bad Request响应。 validate_字段名对field_name字段进行验证如 class BookSerializer(serializers.Serializer):title serializers.CharField(max_length32)price serializers.IntegerField(requiredTrue)pub_date serializers.DateField(requiredTrue)def validate_title(self, value):if django not in value.lower():raise serializers.ValidationError(图书不是关于Django的)return value 测试 from sers.sers import BookSerializer
bs BookSerializer(data{title:小王子,price:100})
bs.is_valid()
False
bs.errors
{title: [ErrorDetail(string图书不是关于Django的, codeinvalid)], pub_date: [ErrorDetail(stringThis field is required., coderequired)]} validate在序列化器中需要同时对多个字段进行比较验证时可以定义validate方法来验证如
class BookSerializer(serializers.Serializer):title serializers.CharField(max_length32)price serializers.IntegerField(requiredFalse)pub_date serializers.DateField(requiredFalse)bread serializers.IntegerField(label阅读量, max_value2147483647, min_value-2147483648, requiredFalse)bcomment serializers.IntegerField(label评论量, max_value2147483647, min_value-2147483648, requiredFalse)def validate_title(self, value):if django not in value.lower():raise serializers.ValidationError(图书不是关于Django的)return valuedef validate(self, data):bread data.get(bread)bcomment data.get(bcomment)if bread bcomment:raise serializers.ValidationError(阅读量小于评论量)return data反序列化-保存数据 前面的验证数据成功后,我们可以使用序列化器来完成数据反序列化的过程.这个过程可以把数据转成模型类对象. 可以通过实现create()和update()两个方法来实现。 在反序列化数据的时候就可以通过save()方法返回一个数据对象实例了book serializer.save() 基于APIView的接口实现 路由 urlpatterns [path(book/, views.BookView.as_view()),re_path(book/(\d), views.BookDetailView.as_view()),
] 视图 # Create your views here.
from rest_framework.views import APIView# 设计增删改查查接口# 视图
class BookView(APIView):def get(self, request):books Book.objects.all()bs BookSerializer(instancebooks, manyTrue)return Response(bs.data)def post(self, request):bs BookSerializer(datarequest.data)if bs.is_valid():bs.save()return Response(bs.data)else:return Response(bs.errors)class BookDetailView(APIView):def get(self, request, pk):book Book.objects.get(pkpk)bs BookSerializer(instancebook)return Response(bs.data)def put(self, request, pk):instance Book.objects.get(pkpk)bs BookSerializer(instanceinstance, datarequest.data)if bs.is_valid():bs.save()return Response(bs.data)else:return Response(bs.errors)def delete(self, request, pk):Book.objects.get(pkpk).delete()return Response() serializer # 序列化器
from rest_framework import serializers
from rest_framework.response import Response
from .models import Bookclass BookSerializer(serializers.Serializer):title serializers.CharField()price serializers.IntegerField()pub_date serializers.DateField()def create(self, validated_data):new_book Book.objects.create(**validated_data)return new_bookdef update(self, instance, validated_data):Book.objects.filter(pkinstance.pk).update(**validated_data)instance Book.objects.get(pkinstance.pk)return instance