19.DjangoRestFramework学习二之序列化组件、视图组件

2023-12-21 11:18

本文主要是介绍19.DjangoRestFramework学习二之序列化组件、视图组件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一 序列化组件

  首先按照restful规范咱们创建一些api接口,按照下面这些形式写吧:

    Courses --- GET ---> 查看数据----->返回所有数据列表[{},{},]

    Courses--- POST --->添加数据 -----> 返回添加的数据{ }

    courses/1 ---PUT---> 更新pk=1的数据 ----->返回更新后的数据{ }

    courses/1 --- DELETE---> 删除pk=1的数据 -----> 返回空

    courses/1 --- GET --->查看单条数据 -----> 返回单条数据 { }

  这样,我们先看一个drf给我们提供的一个类似于Postman功能的页面,首先我们创建一个django项目,创建一个Course表,然后添加一些数据,然后按照下面的步骤操作,

第一步:引入drf的Response对象 

from django.shortcuts import render,HttpResponse,redirect
import json
from django.views import View
from app01 import models
from rest_framework.views import APIView#引用drf提供的Response对象
from rest_framework.response import Response
#写我们的CBV视图
class CourseView(APIView):#返回所有的Course数据def get(self,request):course_obj_list = models.Course.objects.all()ret = []for course_obj in course_obj_list:ret.append({"title":course_obj.title,"desc":course_obj.desc,})# return HttpResponse(json.dumps(ret, ensure_ascii=False))return Response(json.dumps(ret, ensure_ascii=False)) #这里使用Response来返回消息def post(self,request):print(request.data)return HttpResponse('POST')

第二步:配置App,在我们的settings配置文件中配置

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','app01.apps.App01Config','rest_framework',  #将它注册成App
]

第三步,配置我们的路由

"""
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^courses/', views.CourseView.as_view(),name='courses'),
]

第四步:启动项目,通过浏览器访问我们的路由(必须是浏览器访问才能看到对应的功能),看效果:

    这里面我们可以发送不同类型的请求,看到对应的返回数据,类似于Postman,但是没有Postman好用,所以以后调试我们还是用Postman工具,但是我们知道一下昂。

  上面的数据,我们通过json自己进行的序列化,其实django也给我们提供了一个简单的序列化组件,看用法:

from django.shortcuts import render,HttpResponse,redirect
import json
from django.views import View
from app01 import models
from rest_framework.views import APIView
from django.core.serializers import serialize  #django的序列化组件,不是我们要学的drf的序列化组件昂#不用json自己来序列化了,太麻烦,我们使用drf提供的序列化组件
from rest_framework.response import Responseclass CourseView(APIView):def get(self,request):course_obj_list = models.Course.objects.all()# ret = []# for course_obj in course_obj_list:#     ret.append({#         "title":course_obj.title,#         "desc":course_obj.desc,#     })# return HttpResponse(json.dumps(ret, ensure_ascii=False))# return Response(json.dumps(ret, ensure_ascii=False)se_data = serialize('json',course_obj_list,ensure_ascii=False)print(se_data)#也拿到了序列化之后的数据,简洁很多#[{"model": "app01.course", "pk": 1, "fields": {"title": "python", "desc": "666"}}, {"model": "app01.course", "pk": 2, "fields": {"title": "linux", "desc": "\u4e5f\u5f88\u597d"}}, {"model": "app01.course", "pk": 3, "fields": {"title": "go", "desc": "\u5c06\u6765\u53ef\u80fd\u5f88\u597d"}}]return Response(se_data)

  那么我们知道了两个序列化方式了,这个序列化是不是就简单很多啊,但是drf给我们做了一个更牛逼的序列化组件,功能更强大,而且不仅仅能做序列化,还能做其他的事情,所以呢,做api的时候,我们还是用drf提供的序列化组件。

import json
from datetime import datetime
from datetime import date#对含有日期格式数据的json数据进行转换
class JsonCustomEncoder(json.JSONEncoder):def default(self, field):if isinstance(field,datetime):return field.strftime('%Y-%m-%d %H:%M:%S')elif isinstance(field,date):return field.strftime('%Y-%m-%d')else:return json.JSONEncoder.default(self,field)d1 = datetime.now()dd = json.dumps(d1,cls=JsonCustomEncoder)
print(dd)

接下来重点到了,我们玩一下drf提供的数据序列化组件:

1.我们通过GET方法,来查看所有的Course数据。

from django.shortcuts import render,HttpResponse,redirect
import json
from django.views import View
from app01 import models
from rest_framework.views import APIView
from django.core.serializers import serialize  #django的序列化组件,不是我们要学的drf的序列化组件昂
#from rest_framework import status #返回指定状态码的时候会用到
#return Response(se_data,status=status=HTTP_400_BAD_REQUEST)
#或者这种方式返回来指定状态码:return JsonResponse(serializer.data, status=201)
from rest_framework.response import Response# 序列化方式3,1.引入drf序列化组件
from rest_framework import serializers# 2.首先实例化一个类,继承drf的serializers.Serializer,类似于我们的form组件和models的用法
class CourseSerializers(serializers.Serializer):#这里面也要写对应的字段,你写了哪些字段,就会对哪些字段的数据进行序列化,没有被序列化的字段,不会有返回数据,你可以注释掉一个,然后看返回的数据是啥title = serializers.CharField(max_length=32,required=False) #序列化的时候还能校验字段desc = serializers.CharField(max_length=32)class CourseView(APIView):def get(self,request):course_obj_list = models.Course.objects.all()# 3.使用我们创建的序列化类cs = CourseSerializers(course_obj_list, many=True)  # 序列化多个对象的时候,需要些many=True参数#4.通过返回对象的data属性就能拿到序列化之后的数据se_data = cs.dataprint(se_data) #[OrderedDict([('title', 'python'), ('desc', '666')]), OrderedDict([('title', 'linux'), ('desc', '也很好')]), OrderedDict([('title', 'go'), ('desc', '将来可能很好')])] 列表嵌套的有序字典。#还记得创建字典的另外一种写法吗?这个没啥用昂,给大家回顾一下之前的知识# d1 = {'name':'chao'}# d2 = dict([('name','chao'),('age',18)])# print(d1) #{'name': 'chao'}# print(d2) #{'age': 18, 'name': 'chao'}# # 有序字典# from collections import OrderedDict# d3 = OrderedDict([('name','Jaden'),('age',22)])# print(d3) #OrderedDict([('name', 'Jaden'), ('age', 22)])return Response(se_data) #drf的Response如果返回的是drf序列化之后的数据,那么客户端拿到的是一个有格式的数据,不再是一行显示了

  看效果:

2.通过POST方法来添加一条数据:

from django.shortcuts import render,HttpResponse,redirect
from django.views import View
from app01 import models
from rest_framework.views import APIViewfrom rest_framework.response import Responsefrom rest_framework import serializersclass CourseSerializers(serializers.Serializer):title = serializers.CharField(max_length=32)desc = serializers.CharField(max_length=32)class CourseView(APIView):def get(self,request):course_obj_list = models.Course.objects.all()cs = CourseSerializers(course_obj_list, many=True)se_data = cs.datareturn Response(se_data)def post(self,request):# print(request.data) #{'desc': 'java也挺好', 'title': 'java'}#发送过来的数据是不是要进行验证啊,drf的序列化组件还能校验数据cs = CourseSerializers(data=request.data,many=False) #注意必须是data=这种关键字参数,注意,验证单条数据的时候写上many=False参数,而且我们还要序列化这个数据,因为我们要给客户端返回这个数据# print(cs.is_valid()) #True ,如果少数据,得到的是Falseif cs.is_valid():print(cs.data)models.Course.objects.create(**cs.data)#添加数据return Response(cs.data) #按照post添加数据的api规则,咱们要返回正确的数据else:# 假如客户端发送过来的数据是这样的,少title的数据# {#     "desc": "java也挺好"# }cs_errors = cs.errors# print(cs_errors) #{'title'

这篇关于19.DjangoRestFramework学习二之序列化组件、视图组件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/519776

相关文章

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1

PyQt6中QMainWindow组件的使用详解

《PyQt6中QMainWindow组件的使用详解》QMainWindow是PyQt6中用于构建桌面应用程序的基础组件,本文主要介绍了PyQt6中QMainWindow组件的使用,具有一定的参考价值,... 目录1. QMainWindow 组php件概述2. 使用 QMainWindow3. QMainW

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示