当前位置: 首页 > 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.dtcms.com/a/340372.html

相关文章:

  • DeepSeek V3.1 完整评测分析:2025年AI编程新标杆
  • ⭐CVPR2025 给3D高斯穿 “UV 衣” 框架[特殊字符]
  • 路由器NAT的类型测定
  • KubeBlocks AI:AI时代的云原生数据库运维探索
  • Redux 核心概念详解
  • Flutter开发 json_serializable json数据解析
  • 关联规则挖掘2:FP-growth算法(Frequent Pattern Growth,频繁模式增长)
  • rsync + inotify 数据实时同步
  • Android 入门到实战(三):ViewPager及ViewPager2多页面布局
  • 性能测试报告深度解析:从冰冷数据到火热洞察
  • android kernel代码 common-android13-5.15 下载 编译
  • Linux系统:C语言进程间通信信号(Signal)
  • RK3576赋能无人机巡检:多路视频+AI识别引领智能化变革
  • deque的原理与实现(了解即可)
  • 基于截止至 2025 年 6 月 4 日,在 App Store 上进行交易的设备数据统计,iOS/iPadOS 各版本在所有设备中所占比例详情
  • 比剪映更轻量!SolveigMM 视频无损剪切实战体验
  • shell变量进阶
  • 基于51单片机自动浇花1602液晶显示设计
  • Ubuntu-安装Epics Archiver Appliance教程
  • 玳瑁的嵌入式日记D21-08020(数据结构)
  • 服务器内存条不识别及服务器内存位置图
  • 认识Node.js及其与 Nginx 前端项目区别
  • 动手学深度学习(pytorch版):第五章节—多层感知机(1)层和块
  • 从异构计算视角审视ARM与FPGA:架构融合驱动智能时代计算范式革新
  • mybatis xml中表名 字段报红解决
  • S32K328(Arm Cortex-M7)适配CmBacktrace错误追踪
  • 生产电路板的公司有哪些?国内生产电路板的公司
  • 05-网关服务开发指南
  • 从零实现自定义顺序表:万字详解 + 完整源码 + 图文分析
  • 虚幻引擎目录结构