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> ...
随机推荐
- 3.0.0 alpha 重磅发布!九大新功能、全新 UI 解锁调度系统新能力
2022 年 4 月 22 日,Apache DolphinScheduler 正式宣布 3.0.0 alpha 版本发布!此次版本升级迎来了自发版以来的最大变化,众多全新功能和特性为用户带来新的体验 ...
- 操作系统学习笔记5 | 用户级线程 && 内核级线程
在上一部分中,我们了解到操作系统实现多进程图像需要组织.切换.考虑进程之间的影响,组织就是用PCB的队列实现,用到了一些简单的数据结构知识.而本部分重点就是进程之间的切换. 参考资料: 课程:哈工大操 ...
- 【JAVA】学习路径64-补充-编写一个会抛异常的方法
有一些方法,在调用的时候有可能会出错,所以我们使用这些方法的时候会使用try catch. 比如InputStream里面的read()方法等等,那么这些方法是怎么实现抛异常的效果的呢? 能抛异常的方 ...
- 第八篇:用css写一个登录界面
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 第三十一篇:vue3和vue2的不同
好家伙 1.为什么会有vue3? Vue2和Vue3的区别 - 简书 (jianshu.com) 貌似是因为他的对手太优秀,所以他也必须进步 2.什么是api? 从文件操作开始谈API. 以C语言为例 ...
- RHEL7从安装的字符界面转为桌面GUI图形化步骤
1.光驱装载原版光盘镜像 2.挂载光盘镜像 mount /dev/sr0 /media 3.配置本地yum源 vi /etc/yum.repos.d/local.repo [rhel] name=rh ...
- 离线方式安装高可用RKE2 (版本: v1.22.13+rke2r1)记录
说明: 想要了解RKE2可以到官网(https://docs.rke2.io 或 https://docs.rancher.cn/docs/rke2/_index/)看最新资料 用官网给出的离线安装( ...
- 【长文详解】TypeScript、Babel、webpack以及IDE对TS的类型检查
只要接触过ts的前端同学都能回答出ts是js超集,它具备静态类型分析,能够根据类型在静态代码的解析过程中对ts代码进行类型检查,从而在保证类型的一致性.那,现在让你对你的webpack项目(其实任意类 ...
- OOM故障处理流程
一.OOM机制概述 Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,为防止内存耗尽而自动把该进程 ...
- 如何写成高性能的代码(一):巧用Canvas绘制电子表格
一.什么是Canvas Canvas是HTML5的标签,是HTML5的一种新特性,又称画板.顾名思义,我们可以将其理解为一块画布,支持在上面绘制矩形.圆形等图形或logo等. 需要注意的是,与其他标签 ...