DRF序列化器
- 序列化和反序列化介绍
- 之间用的3种序列化方式
- DRF序列化器的三种形式
- DRF序列化器关联表显示
- 改变序列化和反序列化行为
序列化和反序列化介绍
- 在日常开发中,会从别的API获取数据或者自己写API提供数据,数据格式一般都是采用JSON格式。这期间就会涉及两个专业术语:
-
**序列化:**将python对象转json
-
**反序列化:**将json转为python对象
import json
序列化
computer = {"主机":5000,"显示器":1000,"鼠标":60,"键盘":150}
json.dumps(computer)反序列化
json.loads(json_obj)
-
DJango内置Serializers模块
- Serializers是django内置的一个序列化器,可以直接将python转化为python对象转化为json的格式,但不支持反序列化。
- JsonResponse模块自动将Python对象转为JSON对象并响应。
DRF中有一个serializers模块专门负责数据序列化,DRF提供的方案更先进、更高级别的序列化方案。
序列化支持的三种类型
-
**Serializer:**对Model(数据模型)进行序列化,需自定义字段映射
-
**ModelSerializer:**对Model进行序列化,会自动生成字段和验证规则,默认还包含简单的create()和update()方法。
-
**HyperlinkedModelSerializer:**与ModelSerializer类似,只不过使用超链接来表示关系而不是主键ID。
获取所有的用户(查)
- 定义序列化器
myapp_api/serializers.py
python
from rest_framework import serializers
class UserSerializer(serializers.Serializer):
id = serializers.IntegerField()
name = serializers.CharField(max_length=100)
age = serializers.IntegerField()
city = serializers.CharField(max_length=100)
sex = serializers.CharField(max_length=100)
- 2-视图里面使用序列化器
python
from rest_framework.views import APIView
from myapp_api.models import User
from .serializers import UserSerializer
from rest_framework.response import Response
class UserView(APIView):
def get(self, request):
#获取所有请求
queryset = User.objects.all()
#调用序列化器将queryset对象转化为json
# 如果有多条数据需要指定mang=true
user_serializer =UserSerializer(queryset, many=True)
# 获取data属性序列化结果
return Response(user_serializer.data)
-
3.定义路由 myapp_api/urls
from django.contrib import admin
from django.urls import path,include,re_path
from rest_framework import routers
from myapp_api import views#注册路由
urlpatterns = [
re_path('api/user/$',views.UserView.as_view()),
]

-
获取单个用户(进行查找)
-
定义视图views
from rest_framework.views import APIView
from myapp_api.models import User
from .serializers import UserSerializer
from rest_framework.response import Responseclass UserView(APIView):
def get(self, request ,pk=None):
if pk:
# 获取单个用户
user_obj= User.objects.get(id=pk)
serializer = UserSerializer(user_obj)
else:
#获取所有的用户
#获取所有请求
queryset = User.objects.all()
#调用序列化器将queryset对象转化为json
# 如果有多条数据需要指定mang=true
user_serializer =UserSerializer(queryset, many=True)
# 获取data属性序列化结果
result = {"code":200,"data":user_serializer.data}
return result -
定义路由
from django.contrib import admin
from django.urls import path,include,re_path
from rest_framework import routers
from myapp_api import views#注册路由
urlpatterns = [
re_path('api/user/',views.UserView.as_view()), re_path('api/user/(?P\d+)/ ',views.UserView.as_view()),
]

-
创建用户
def post(self,request): user_ser = UserSerializer(data=request.data) if user_ser.is_valid(): user_ser.save() msg = "创建成功" code =200 else: msg = user_ser.errors code = 400 result = {'code':code,'msg':msg} return Response(result)
-
定义create的方法


drf序列化小结
-
序列化工作流
序列化(读数据):视图里通过ORM从数据库获取数据查询集对象 -> 数据传入序列化器
-> 序列化器将数据进行序列化 -> 调用序列化器的.data获取数据 -> 响应返回前端
反序列化(写数据):视图获取前端提交的数据 -> 数据传入序列化器 -> 调用序列化器
的.is_valid方法进行效验 -> 调用序列化器的.save()方法保存数据
序列化器常用方法与属性:
• serializer.is_valid():调用序列化器验证是否通过,传入raise_exception=True可以在
验证失败时由DRF响应400异常。
• serializer.errors:获取反序列化器验证的错误信息
• serializer.data:获取序列化器返回的数据
• serializer.save():将验证通过的数据保存到数据库(ORM操作)
DRF序列化器ModelSerializer
-
ModelSerializer类型不需要自定义映射和定义create,update方法使用起来方便很多。
-
-----我认为这是最好的一种方式
from rest_framework import serializers
from myapp_api.models import Userclass UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = 'all'
Meta类常用属性:
• fields:显示所有或指定字段
• exclude:排除某个字段,元组格式,不能与fields同时用
• read_only_fields:只读字段,即只用于序列化,不支持修改
• extra_kwargs:添加或修改原有的字段参数,字典格式
• depth:根据关联的数据递归显示,一般是多表
DRF序列化,关联表的显示
例如:应用发布系统项目涉及表
一对多:一个项目有多个应用,一个应用只能属于一个项目
多对多:一个应用部署到多台服务器,一个服务器部署多个应用