django drf 统一处理操作人和时间字段

场景

如果你的表结构有这些字段:创建人/创建时间/更新人/更新时间/删除人/删除时间,我们可以统一处理这些字段的更新和插入,而不需要额外显示操作。

代码

1.ActionViewSetMixin:

import datetime
from rest_framework import status
from rest_framework.response import Responseclass ActionViewSetMixin:def destroy_mixin(self, request):instance = self.get_object()data = {"deleted_by": request.user.username,"deleted_at": datetime.datetime.now(),"is_deleted": True,}serializer = self.get_serializer(instance, data=data, partial=True)serializer.is_valid(raise_exception=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 destroy(self, request, *args, **kwargs):return self.destroy_mixin(request)def update_mixin(self, request, serializer):serializer.is_valid(raise_exception=True)data = serializer.validated_datadata["updated_by"] = request.user.usernamedata["updated_at"] = datetime.datetime.now()partial = Trueinstance = self.get_object()serializer = self.get_serializer(instance, data=data, partial=partial)serializer.is_valid(raise_exception=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 update(self, request, *args, **kwargs):serializer_class = kwargs.pop("serializer", self.get_serializer)return self.update_mixin(request, serializer_class(data=request.data))def create_mixin(self, request, *args, **kwargs):data = request.data.copy()data["created_by"] = request.user.usernamedata["created_at"] = datetime.datetime.now()serializer_class = kwargs.pop("serializer", self.get_serializer)serializer = serializer_class(data=data)serializer.is_valid(raise_exception=True)self.perform_create(serializer)headers = self.get_success_headers(serializer.data)return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)def create(self, request, *args, **kwargs):return self.create_mixin(request, *args, **kwargs)

2.APIModelViewSet继承ModelViewSet和ActionViewSetMixin:

from rest_framework.viewsets import ModelViewSetfrom common.drf.mixins import ActionViewSetMixin, ResponseMixinclass APIModelViewSet(ActionViewSetMixin, ResponseMixin, ModelViewSet):extra_permissions = []  # 不覆盖默认的权限action_extra_permission_mapping = {}def parse_page_params(self):if self.request.method == "GET":page = self.request.query_params.get("page", 1)page_size = self.request.query_params.get("page_size", 10)else:page = self.request.data.get("page", 1)page_size = self.request.data.get("page_size", 10)try:return int(page), int(page_size)except Exception as e:return 1, 10def get_permissions(self):permissions = super(APIModelViewSet, self).get_permissions()extra = [x() for x in self.extra_permissions]action = self.action_extra_permission_mapping.get(self.action, [])return permissions + extra + [p() for p in action]@classmethoddef get_validated_params(cls, serializer, params):s = serializer(data=params)s.is_valid(raise_exception=True)return s.validated_data

3.视图类继承APIModelViewSet:

class ScanRecordViewSet(APIModelViewSet):queryset = models.ScanRecord.exclude_deleted_objects.all()serializer_class = serializers.ScanRecordSerializerpagination_class = DataPageNumberPaginationfilter_backends = [CustomFilterBackend, SearchFilter]search_fields = ["status", "mode", 'risk']custom_query_fields = ["status", "mode", "risk"]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/54875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 字符串(String)的应用说明二

字符串(String)的常用应用说明: 一.String 类的属性: String 类有以下两个属性: 1.Chars属性,在当前 String 对象中获取 Char 对象的指定位置; 2.Length属性,在当前的 String 对…

SpringMVC5-域对象共享数据

目录 使用ServletAPI向request域对象共享数据 使用ModelAndView向request域对象共享数据 使用Model向request域对象共享数据 使用map向request域对象共享数据 使用ModelMap向request域对象共享数据 Model、ModelMap、Map的关系 向session域共享数据 向application域共享…

asp.net core grpc快速入门

环境 .net 8 vs2022 创建 gRPC 服务器 一定要勾选Https 安装Nuget包 <PackageReference Include"Google.Protobuf" Version"3.28.2" /> <PackageReference Include"Grpc.AspNetCore" Version"2.66.0" /> <PackageR…

Python | Leetcode Python题解之第441题排列硬币

题目&#xff1a; 题解&#xff1a; class Solution:def arrangeCoins(self, n: int) -> int:left, right 1, nwhile left < right:mid (left right 1) // 2if mid * (mid 1) < 2 * n:left midelse:right mid - 1return left

Junit 5 - 理解Mockito,提高UT 覆盖率

前言 当我是1个3年初级程序员时&#xff0c; 我被面试者问到1个问题&#xff1a; 如何保证你的开发任务交付质量 当我是1个7年开发组长时&#xff0c; 我被面试者问到另1个问题&#xff1a;如何保证你的团队的代码质量&#xff0c; 减少rework。 又若干年后&#xff0c; 我才…

Mysql调优之索引优化(四)

一、mysql索引结构B树原理 B树开始就是n树&#xff0c;不是二叉树 B树的非叶子结点存储了数据&#xff0c;导致层级会很深&#xff0c;每一层又有数据又有索引。 B树只有叶子结点存储数据&#xff0c;其余都是存储索引&#xff0c;增加了每层存取索引的数量&#xff08;3层结构…

Comfyui 学习笔记1

如果图像输出被裁剪&#xff0c;则需要使用PrepImageForClipVision&#xff0c;来设置图像距离上边沿的位置. 决定绘画的作用区域&#xff0c;后面的KSample只作用到 mask标记的范围。 图像位置偏移了&#xff0c;可以考虑通过Image crop 裁剪 IPAdapter face 提取时&…

OceanBase 3.X 高可用 (一)

OceanBase 3.X 高可用&#xff08;一&#xff09; 一、分布式核心 OceanBase 3.x 采用的是paxos 协议&#xff0c;与raft协议相比。其复杂程度高&#xff0c;实现技术难度大。 Paxos 协议允许事务日志乱序发送&#xff0c;顺序提交。raft允许事务顺序发送&#xff0c;顺序提…

的使用和内联函数

今天我们来了解一下C中的&和内联函数 引用标识符& C觉得C语言部分的指针有些麻烦&#xff0c;容易混乱&#xff0c;所以C创造了一个标识符&&#xff0c;表示是谁的别名。跟指针对比一下&#xff1a;int* a1&b1;int &a2b2;这样看&#xff0c;显然a1存放的…

【java】前端RSA加密后端解密

目录 1. 说明2. 前端示例3. 后端示例3.1 pom依赖3.2 后端结构图3.3 DecryptHttpInputMessage3.4 ApiCryptoProperties3.5 TestController3.6 ApiCryptoUtil3.7 ApiDecryptParamResolver3.8 ApiDecryptRequestBodyAdvice3.9 ApiDecryptRsa3.10 ApiCryptoProperties3.11 KeyPair3…

爱速搭百度低代码开发平台

爱速搭介绍 爱速搭是百度智能云推出的低代码开发平台&#xff0c;它灵活性强&#xff0c;对开发者友好&#xff0c;在百度内部大规模使用&#xff0c;有超过 4w 内部页面是基于它制作的&#xff0c;是百度内部中台系统的核心基础设施。 它具备以下功能&#xff1a; 页面制作…

Android界面控件概述

节选自《Android应用开发项目式教程》&#xff0c;机械工业出版社&#xff0c;2024年7月出版 做最简单的安卓入门教程&#xff0c;手把手视频、代码、答疑全配齐 控件是Android界面的重要组成单元&#xff0c;Android应用主要通过控件与用户交互&#xff0c;Android提供了非常…

raise Exception(“IPAdapter model not found.“)

IPAdapter模型文件太多了&#xff0c;而节点IPAdapter Unified Loader是通过函数&#xff08;get_ipadapter_file与get_clipvision_file&#xff09;预设来加载模型文件&#xff0c;当发生错误“IPAdapter model not found.“时并不指明模型文件名&#xff0c;导致想要有针对性…

在MacOS上安装MongoDB数据库

一、安装方法 1.1 安装包安装 首先&#xff0c;打开MongoDB 官网下载安装包&#xff0c;下载链接&#xff1a;https://www.mongodb.com/try/download/community。 根据自己的系统环境自行选择下载的版本。将下载好的 MongoDB 安装包解压缩&#xff0c;并将文件夹名改为 mon…

Go语言接口与多态

Go语言虽然并非传统意义上的面向对象语言&#xff0c;但它通过接口&#xff08;Interface&#xff09;和匿名组合&#xff08;Composition&#xff09;等机制&#xff0c;实现了类似面向对象编程中的多态性&#xff08;Polymorphism&#xff09;。接口和多态性是Go语言中非常重…

信息技术对现代商业的推动作用及未来趋势

信息技术对现代商业的推动作用及未来趋势 目录 引言信息技术对商业的推动作用 业务流程自动化供应链优化客户关系管理电子商务的崛起 信息技术对不同行业的影响 零售行业制造业金融行业 信息技术带来的挑战 数据隐私问题技术迭代的压力信息孤岛现象 未来信息技术的发展趋势 人…

开源大模型 vs闭源大模型

在人工智能&#xff08;AI&#xff09;领域&#xff0c;如何评价一个AI模型的优劣和发展前景&#xff0c;是一个复杂而又广泛讨论的问题。在这个过程中&#xff0c;"开源"和"闭源"的发展路径成为绕不开的两条道路。开源模式以共享知识和技术进步为宗旨&…

理解:基础地理实体相关概述

理解&#xff1a;基础地理实体相关概述 地理实体 geo-entity 现实世界中占据一定且连续空间位置和范围、单独具有同一属 性或完整功能的地理对象。 基础地理实体 fundamental geo-entity 通过基础测绘采集和表达的地理实体&#xff0c;是其他地理实体和相关 信息的定位框架与…

卡通角色检测系统源码分享

卡通角色检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

Keepalived+MySQL 高可用集群

基础架构如下 准备干净的实验环境 [rootmysql1 ~]# systemctl stop firewalld [rootmysql1 ~]# cat /etc/sysconfig/selinux |grep "SELINUXdisabled" SELINUXdisabled [rootmysql1 ~]# setenforce 0 setenforce: SELinux is disabled [rootmysql1 ~…