当前位置: 首页 > news >正文

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序列化,关联表的显示

例如:应用发布系统项目涉及表

一对多:一个项目有多个应用,一个应用只能属于一个项目

多对多:一个应用部署到多台服务器,一个服务器部署多个应用

http://www.xdnf.cn/news/1335853.html

相关文章:

  • PyTorch API 7
  • 数据安全事件分级
  • 嵌入式的各个要点总结(不断更新)
  • KubeBlocks for ClickHouse 容器化之路
  • 第三十三天(信号量)
  • GO环境变量中GO111MODULE到底是干啥的?
  • 【NFTurbo】基于Redisson滑动窗口实现验证码发送限流
  • 【运维】githubvercel学习使用
  • nginx-下载功能-状态统计-访问控制
  • Qt 中最经典、最常用的多线程通信场景
  • 安装electron报错的解决方法
  • 【Express零基础入门】 | 构建简易后端服务的核心知识
  • jvm三色标记
  • imx6ull-驱动开发篇30——Linux 非阻塞IO实验
  • 机器学习--数据清洗—(续篇)
  • 算法 ----- 链式
  • 基础笔记8.20
  • 【运维进阶】shell三剑客
  • RK-Android11-PackageInstaller安装器自动安装功能实现
  • 福昕PDF编辑软件高级版下载与详细图文安装教程!!
  • 力扣 30 天 JavaScript 挑战 第36天 第8题笔记 深入了解reduce,this
  • 【嵌入式电机控制#34】FOC:意法电控驱动层源码解析——HALL传感器中断(不在两大中断内,但重要)
  • day075-MySQL数据库服务安装部署与基础服务管理命令
  • 《算法导论》第 35 章-近似算法
  • imx6ull-驱动开发篇31——Linux异步通知
  • 极其简单二叉树遍历JAVA版本
  • 虚拟机部署HDFS集群
  • Redisson最新版本(3.50.0左右)启动时提示Netty的某些类找不到
  • VR交通安全学习机-VR交通普法体验馆方案
  • 从防抖节流到链表树:编程世界中的抽象优化艺术