23.mixin类源码解析
"""
提供 .create(request, *args, **kwargs) 方法,实现创建和保存一个新model实例的功能。
如果创建了一个对象,这将返回一个 201 Created 响应,将该对象的序列化表示作为响应的
主体。如果序列化的表示中包含名为 url 的键,则响应的 Location 头将填充该值。
如果为创建对象提供的请求数据无效,将返回 400 Bad Request ,其中错误详细信息作为响应的正文。
"""
#源码
class CreateModelMixin:
"""
Create a model instance.
"""
def create(self, request, *args, **kwargs):
#序列化数据
serializer = self.get_serializer(data=request.data)
#is_valid判断序列化是否数据是否有效,raise_exception=Teue有问题自动抛出错误
serializer.is_valid(raise_exception=True)
# 调用下方方法保存数据
self.perform_create(serializer)
# 成功的headers
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def perform_create(self, serializer):
"""
单独写一个函数调用.save,这样写的意义是后续保存前需要做其他事情,
直接重写该方法就可以
"""
serializer.save()
def get_success_headers(self, data):
try:
return {'Location': str(data[api_settings.URL_FIELD_NAME])}
except (TypeError, KeyError):
return {}
"""
提供一个 .list(request, *args, **kwargs) 方法,返回查询结果的列表。
如果查询集被填充了数据,则返回 200 OK 响应,将查询集的序列化表示作为响应的主体。
相应数据可以任意分页。
"""
#源码
class ListModelMixin:
"""
List a queryset.
"""
def list(self, request, *args, **kwargs):
"""
self.get_queryset() 获取查询结果集
self.filter_queryset() 留了一个钩子,如果有需要,可以过滤结果集
"""
queryset = self.filter_queryset(self.get_queryset())
# 设置分页
page = self.paginate_queryset(queryset)
# 如果页码不为空
if page is not None
# 获取指定页面的序列化内容
serializer = self.get_serializer(page, many=True)
# 返回指定页面的数据
return self.get_paginated_response(serializer.data)
# 如果页码为空,则返回全部数据
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
"""
提供一个 .retrieve(request, *args, **kwargs) 方法,返回响应中现有模型的实例。
如果可以检索对象,则返回 200 OK 响应,将该对象的序列化表示作为响应的主体。否则将
返回 404 Not Found 。
"""
#源码
class RetrieveModelMixin:
"""
Retrieve a model instance.
"""
def retrieve(self, request, *args, **kwargs):
# 获取指定look_up_field查询的内容
instance = self.get_object()
# 序列化数据
serializer = self.get_serializer(instance)
return Response(serializer.data)
"""
提供 .update(request, *args, **kwargs) 方法,实现更新和保存现有模型实例的功能
同时还提供了一个 .partial_update(request, *args, **kwargs) 方法,这个方法
和 update 方法类似,但更新的所有字段都是可选的。这允许支持 HTTP PATCH 请求。
如果一个对象被更新,这将返回一个 200 OK 响应,并将对象的序列化表示作为响应的主体。
如果为更新对象提供的请求数据无效,将返回一个 400 Bad Request 响应,错误详细信息作为响应的正文。
"""
#源码
class UpdateModelMixin:
"""
Update a model instance.
"""
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
# 查询指定的lookup_filed结果
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_ex ception=True)
self.perform_update(serializer)
if getattr(instance, '_prefetched_objects_cache', None):
# If 'prefetch_related' has been applied to a queryset, we need to
# forcibly invalidate the prefetch cache on the instance.
instance._prefetched_objects_cache = {}
return Response(serializer.data)
def perform_update(self, serializer):
#修改数据,如果操作前需要其他操作,重写该方法
serializer.save()
# 局部修改
def partial_update(self, request, *args, **kwargs):
kwargs['partial'] = True
return self.update(request, *args, **kwargs)
"""
提供一个 .destroy(request, *args, **kwargs) 方法,实现删除现有模型实例的功能。
如果成功删除对象,则返回 204 No Content 响应,否则返回 404 Not Found 。
DRF对mixin类的设计是让它们可以尽量的组合使用,不是一次只能继承一个mixin,可以同时继承多个mixin
"""
#源码
class DestroyModelMixin:
"""
Destroy a model instance.
"""
def destroy(self, request, *args, **kwargs):
# 查询指定的lookup_filed结果
instance = self.get_object()
# 删除指定数据
self.perform_destroy(instance)
return Response(status=status.HTTP_204_NO_CONTENT)
def perform_destroy(self, instance):
# 删除前需要其他操作的话,可以重写该方法
instance.delete()
23.mixin类源码解析的更多相关文章
- Java集合---Array类源码解析
Java集合---Array类源码解析 ---转自:牛奶.不加糖 一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Prim ...
- java.lang.Void类源码解析_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 在一次源码查看ThreadGroup的时候,看到一段代码,为以下: /* * @throws NullPointerEx ...
- Java集合---Arrays类源码解析
一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Primitive(8种基本类型)和Object两大类. 基本类型:采用调优的快速排序: 对象类型: ...
- ArrayList类源码解析——ArrayList动态数组的实现细节(基于JDK8)
一.基本概念 ArrayList是一个可以添加对象元素,并进行元素的修改查询删除等操作的容器类.ArrayList底层是由数组实现的,所以和数组一样可以根据索引对容器对象所包含的元素进行快速随机的查询 ...
- Thread类源码解析
源码版本:jdk8 其中的部分论证和示例代码:Java_Concurrency 类声明: Thread本身实现了Runnable接口 Runnable:任务,<java编程思想>中表示该命 ...
- Dom4j工具类源码解析
话不多说,上源码: package com.changeyd.utils;import java.io.File;import java.io.FileNotFoundException;import ...
- Spring-IOC MethodInvokingFactoryBean 类源码解析
MethodInvokingFactoryBean MethodInvokingFactoryBean的作用是,通过定义类和它的方法,然后生成的bean是这个方法的返回值,即可以注入方法返回值. Me ...
- 机器学习:weka中Evaluation类源码解析及输出AUC及交叉验证介绍
在机器学习分类结果的评估中,ROC曲线下的面积AOC是一个非常重要的指标.下面是调用weka类,输出AOC的源码: try { // 1.读入数据集 Instances data = new Inst ...
- java.lang.Boolean 类源码解析
Boolean源码比较简单. public final class Boolean implements java.io.Serializable, Comparable<Boolean> ...
随机推荐
- 高并发之网络IO模型
你好,我是坤哥 今天我们聊一下高并发下的网络 IO 模型 高并发即我们所说的 C10K(一个 server 服务 1w 个 client),C10M,写出高并发的程序相信是每个后端程序员的追求,高并发 ...
- 将 Word 文本转换为表格
文本转换为表格的功能,首先点击"插入"选项卡"表格"组中的"表格"下拉按钮,打开下拉列表中选择"文本转换成表格"选项.
- 【java】学习路径45-多线程-线程生命周期
线程分为五大状态:新建.就绪.运行.阻塞.死亡. New,Runnable,Running,Blocked,Terminated. 新建状态(New: 创建好一个系统对象,在调用start()之前,线 ...
- 【java】基础1-字符串、堆、栈、静态与引用类型
/*结论:1,一般变量(int,float,boolean..)使用==比较,引用类型(String,int[],对象)使用equals比较.2,一般的变量存放在栈中,new出来的对象都存放在堆中,字 ...
- Linux软件包常见的几种下载、安装方法
在线源下载和安装 如果服务器是处于在线状态,在使用默认下载源是外国的情况下,安装更新软件包往往会比较痛苦的存在,下载了许久来一个超时就gg了.国内有许多镜像源,完美的解决了这个问题. 对于rpm系列的 ...
- ASP.NET Core 6框架揭秘实例演示[35]:利用Session保留语境
客户端和服务器基于HTTP的消息交换就好比两个完全没有记忆能力的人在交流,每次单一的HTTP事务体现为一次"一问一答"的对话.单一的对话毫无意义,在在同一语境下针对某个主题进行的多 ...
- docker学习笔记-常用镜像相关命令
docker images # 1.使用 [root@iZbp13qr3mm4ucsjumrlgqZ ~]# docker images REPOSITORY TAG IMAGE ID CREATED ...
- MySQL8.0报错:Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation
MySQL8.0.16版本中新增了一个system_user帐户类型,当新增用户并赋予权限时 mysql> create user 'proxysql'@'192.168.20.%' ident ...
- K8s 上的分布式存储集群搭建(Rook/ceph)
转载自:https://mp.weixin.qq.com/s/CdLioTzU4oWI688lqYKXUQ 1 环境准备 1.1 基础环境 3台配置一致的虚拟机 虚拟机配置:4c 8g 虚拟机操作系统 ...
- 从Kubernetes Event中提取有效信息