序列化组件的三大功能
-
序列化,序列化器会把模型对象转换成字典,经过response以后变成json字符串
-
反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型
-
反序列化时同时会完成数据校验功能
序列化器Serializer使用方法
查询单个数据语法:
1.在setting.py中的app配置里注册一下drf
2.在django的模型层创建一个表
from django.db import models
# Create your models here.
class Book(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
author = models.CharField(max_length=32)
3.在表中添加一些数据
4.编写序列化组件(类似forms组件),可以在应用下单独创一个文件夹,里面放序列化组件.py
from rest_framework import serializers# 导入drf中的序列化类
# 创建一个类继承Serializer序列化类
class BookSerializer(serializers.Serializer):
# 定义需要序列化的字段,想要哪个字段就添加该字段,不需要就注释掉
nid = serializers.CharField()
name = serializers.CharField()
price = serializers.CharField()
5.在url.py中开设路径获取序列化之后的数据
urlpatterns = [
path('admin/', admin.site.urls),
re_path(r'^book/(?P<pk>\d+)/$',views.BooksView.as_view()) #CBV格式的url
]
6.在视图函数中序列化需要的模型对象,返回给前端页面字典格式的数据
from rest_framework.views import APIView # 导入drf模块的apiview,使得cbv格式的视图函数继承它
from app01 import models
from .ser import BookSerializer # 导入自己写好的序列化组件
from rest_framework.response import Response # 导入drf模块的响应类
class BooksView(APIView):
# get请求的视图函数
def get(self,request,pk):
# 得到需要查询的模型对象
book = models.Book.objects.filter(pk=pk).first()
# 将模型对象交给自己写好的序列化器,生成一个序列化对象
book_ser = BookSerializer(book)
# book_ser.data 序列化对象.data就是序列化后的字典
return Response(book_ser.data) # 利用drf中的Response类返回给前端,Response会帮您把这个字典序列化成json格式!
# 使用JsonResponse返回上述字典,在浏览器就没有Response漂亮的格式而已,也是返回json数据格式
return JsonResponse(book_ser.data,json_dumps_params={'ensure_ascii':False})
查询所有语法:
# views.py
class BooksView(APIView):
def get(self,request):
response_msg = {'status': 100, 'msg': '成功'}
books=Book.objects.all()
book_ser=BookSerializer(books,many=True) #序列化多条,如果序列化一条,不需要写
response_msg['data']=book_ser.data
return Response(response_msg)
#urls.py
path('books/', views.BooksView.as_view()),
修改数据语法
1.在cbv格式的视图函数中添加put函数
def put(self,request,pk):
back_dic = {'code':1000,'msg':'成功'}
# 1.得到需要查询的模型对象
book = models.Book.objects.filter(pk=pk).first()
# 2. 将模型对象交给自己写好的序列化器,生成一个序列化对象,除了传模型对象,还需要传入用户修改的数据
book_ser = BookSerializer(instance=book,data=request.data)
# 3.进行数据校验,类似forms组件的校验
is_right = book_ser.is_valid()
if is_right:
# 4.校验通过操作序列化对象保存修改数据
book_ser.save() # 注意这里需要在序列化组件中重写update()方法,否则报错
# 5.将正确的数据在返回给前端
back_dic['data'] = book_ser.data
else:
back_dic['code'] = 1001
back_dic['msg'] = '数据格式不正确'
back_dic['data'] = book_ser.errors
return Response(back_dic)
2.在自定义的序列化组件类中添加update()方法
def update(self, instance, validated_data):
# instance参数就是book这个对象,validated_data就是用户修改提交上来的字典格式数据
# 1.修改这个对象的字段值
instance.name = validated_data.get('name')
instance.price = validated_data.get('price')
# 2.操作数据库保存修改数据
instance.save() # 相当于book.save() 是django orm提供的方法
# 最后需要把这个book对象在返回出去
return instance
新增数据语法
# views.py
class BooksView(APIView):
# 新增
def post(self,request):
response_msg = {'status': 100, 'msg': '成功'}
#修改才有instance,新增没有instance,只有data
book_ser = BookSerializer(data=request.data)
# book_ser = BookSerializer(request.data) # 这个按位置传request.data会给instance,就报错了
# 校验字段
if book_ser.is_v