DRF序列化器
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
from rest_framework import serializersclass 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-视图里面使用序列化器
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):#获取所有请求queryset = User.objects.all()#调用序列化器将queryset对象转化为json# 如果有多条数据需要指定mang=trueuser_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()),
]
访问http://127.0.0.1:8000/myapp_api/api/user/
-
获取单个用户(进行查找)
-
定义视图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=trueuser_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<pk>\d+)/$',views.UserView.as_view()),
]
User – Django REST framework
- 创建用户
def post(self,request):user_ser = UserSerializer(data=request.data)if user_ser.is_valid():user_ser.save()msg = "创建成功"code =200else:msg = user_ser.errorscode = 400result = {'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 = Userfields = '__all__'
Meta类常用属性:
• fields:显示所有或指定字段
• exclude:排除某个字段,元组格式,不能与fields同时用
• read_only_fields:只读字段,即只用于序列化,不支持修改
• extra_kwargs:添加或修改原有的字段参数,字典格式
• depth:根据关联的数据递归显示,一般是多表
DRF序列化,关联表的显示
例如:应用发布系统项目涉及表
一对多:一个项目有多个应用,一个应用只能属于一个项目
多对多:一个应用部署到多台服务器,一个服务器部署多个应用