[Django REST framework - 序列化组件、source、钩子函数]
序列化器-Serializer
什么是rest_framework序列化?
在写前后端不分离的项目时:
我们有form组件帮我们去做数据校验
我们有模板语法,从数据库取出的queryset对象不需要人为去转格式
当我们写前后端分离项目的时:
我们需要自己去做数据校验
我们需要手动去转数据格式,因为跨平台数据传输都用json字符串,不能直接jsonqueryset对象
序列化器的作用
1 序列化:把python中的对象转成json格式字符串
序列化器会把模型对象转换成字典,经过response以后变成json字符串
2 反序列化:把json格式字符串转成python中的对象
把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型
3 注意:drf的序列化组件(序列化器)
把对象(Book,queryset对象)转成字典
因为有字典,直接丢到Response中就可以了
序列化,反序列化
-对象----》json
-json---》对象
序列化器
-定义一个类,继承Serializer
-在类内些字段(常用字段,和非常用字段)(字段参数)
-在视图类中,实例化得到一个序列化类的对象,传入要序列化的数据
-对象.data---》就是字典
-source
序列化器的基本使用
from rest_framework.serializers import Serializer,ModelSerializer
from rest_framework import serializers
Serializer是rest_framework原生的序列化组件
ModelSerializer是rest_framework在原生的序列化组件的基础上封装了一层的序列化组件
用法:1、在用我们的rest_framework序列化组件的时候,我们的视图层都必须写视图类,不能再写视图函数
2、我们需要针对每一张模型表写一个类来继承Serailizer或者ModelSerailizer类,
注:当我们在视图类里需要对数据进行序列化或者反序列化的时候,在自己定义的类传入需要序列化的数据实例化,
调用.data即可拿到序列化或者校验后的数据了
Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializer
1 写一个序列化的类,继承Serializer
class BookSerializer(serializers.Serializer):
name = serializers.CharField()
price = serializers.IntegerField()
2 在类中写要序列化的字段(常用字段,和非常用字段)(字段参数)
name = serializers.CharField()
price = serializers.IntegerField()
3 在视图类中使用(实例化得到一个序列化类的对象,传入要序列化的数据)
class BookView(APIView):
def get(self, request):
book_list = models.Book.objects.all()
book_ser = BookSerializer(instance=book_list, many=True)
return Response(book_ser.data)
4 得到序列化后的数据,返回(对象.data---》就是字典)
book_ser.data
5 字段参数,source,指定要序列化表中的哪个字段
路由层 urls.py
from django.urls import path
from app import views
urlpatterns = [
path('admin/', admin.site.urls),
path('books_new/', views.BookView.as_view()),
path('books_new/<int:id>/', views.BookViewId.as_view()),
]
模型层 models.py
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=32, verbose_name='书名')
publish = models.CharField(max_length=32, verbose_name='出版社')
price = models.IntegerField(verbose_name='价格')
序列化器层 serializer.py
from rest_framework import serializers
from app import models
class BookSerializer(serializers.Serializer):
name = serializers.CharField()
price