深入解析 Django 中数据删除的最佳实践:以动态管理镜像版本为例
文章目录
- 引言
- 场景与模型设计
- 场景描述
- 删除操作详解
- 1. 删除单个 Tag
- 2. 批量删除 Tags
- 3. 删除前确认
- 4. 日志记录
- 高阶优化与问题分析
- 1. 外键约束与误删保护
- 2. 并发删除的冲突处理
- 3. 使用软删除
- 结合 Django Admin 的实现
- 总结与实践思考
引言
在现代应用开发中,服务和版本的动态管理是常见需求。例如,开发一个支持多版本的服务管理系统,其中需要定期删除不再使用的镜像版本(Tags)。如何在 Django 项目中安全、高效地删除这些数据?有哪些常见的坑需要注意?
本文将以一个动态管理系统为例,深入讲解 Django 的删除逻辑、设计模式及最佳实践。
场景与模型设计
场景描述
假设我们正在开发一个支持多服务的镜像版本管理平台:
- 每个服务(如 Redis、MySQL)可以有多个镜像版本。
- 需要支持动态增删镜像版本(Tag),例如删除过期版本
redis:6.2.6
。 - 删除逻辑需要兼顾性能和安全,避免误删或关联数据丢失。
模型设计如下:
from django.db import models
from django.utils.timezone import nowclass Service(models.Model):"""服务表"""name = models.CharField("服务名称", max_length=50, unique=True)create_time = models.DateTimeField("创建时间", default=now)class Meta:db_table = "service"ordering = ("-id",)def __str__(self):return self.nameclass ImageTag(models.Model):"""镜像标签表"""image = models.CharField("镜像名称", max_length=128)tag = models.CharField("版本标签", max_length=50)create_time = models.DateTimeField("创建时间", default=now)service = models.ForeignKey(Service, on_delete=models.CASCADE, related_name="image_tags")class Meta:db_table = "image_tag"ordering = ("-id",)def __str__(self):return f"{self.image}:{self.tag}"
注意:在设计时,
Service
表通过外键与ImageTag
表建立一对多关联。镜像版本(Tag)依赖具体服务存在。
删除操作详解
1. 删除单个 Tag
需求:删除镜像 redis
的版本 6.2.6
。
代码示例:
# 查询并删除单个 Tag
image_tag = ImageTag.objects.get(image="redis", tag="6.2.6")
image_tag.delete()
输出:
>>> 删除镜像标签: redis:6.2.6
2. 批量删除 Tags
需求:删除镜像 redis
所有 6.x
版本的 Tags。
代码示例:
# 批量删除
ImageTag.objects.filter(image="redis", tag__startswith="6.").delete()
输出:
>>> 删除以下镜像版本:
- redis:6.2.6
- redis:6.0.9
3. 删除前确认
在删除前,通过打印或日志记录,确认将要删除的镜像版本,避免误删。
tags_to_delete = ImageTag.objects.filter(image="redis", tag__startswith="6.")
for tag in tags_to_delete:print(f"即将删除: {tag.image}:{tag.tag}")# 确认后删除
tags_to_delete.delete()
输出:
即将删除: redis:6.2.6
即将删除: redis:6.0.9
4. 日志记录
通过引入日志记录操作,追踪删除记录,便于后续审计:
import logginglogger = logging.getLogger(__name__)image_tag = ImageTag.objects.get(image="redis", tag="6.2.6")
logger.info(f"删除镜像标签: {image_tag.image}:{image_tag.tag}")
image_tag.delete()
高阶优化与问题分析
1. 外键约束与误删保护
当前外键使用 on_delete=models.CASCADE
,即删除服务会级联删除所有 Tags。如果需要保护关联数据,可以改为:
PROTECT
:阻止删除服务,强制保留关联的 Tags。SET_NULL
:删除服务时将 Tags 的service
字段置为NULL
。
service = models.ForeignKey(Service, on_delete=models.PROTECT)
2. 并发删除的冲突处理
多个用户同时删除数据可能引发冲突或覆盖操作。可以通过事务管理保证一致性:
from django.db import transactiontry:with transaction.atomic():image_tag = ImageTag.objects.get(image="redis", tag="6.2.6")image_tag.delete()
except ImageTag.DoesNotExist:print("镜像标签不存在,可能已被其他用户删除。")
3. 使用软删除
如果需要保留删除记录(如审计需求),可以引入软删除逻辑:
class SoftDeleteModel(models.Model):is_deleted = models.BooleanField(default=False)delete_time = models.DateTimeField(null=True, blank=True)def delete(self):self.is_deleted = Trueself.delete_time = now()self.save()class Meta:abstract = True
继承 SoftDeleteModel
,实现软删除:
class ImageTag(SoftDeleteModel):# 其他字段省略pass
结合 Django Admin 的实现
配置 Django Admin,使删除操作更加可控:
@admin.register(ImageTag)
class ImageTagAdmin(admin.ModelAdmin):list_display = ("id", "image", "tag", "service", "create_time")search_fields = ("image", "tag")def delete_model(self, request, obj):print(f"管理员 {request.user} 删除了镜像标签: {obj.image}:{obj.tag}")obj.delete()
总结与实践思考
在 Django 项目中,数据删除需要注意以下几点:
- 精确筛选:确保查询条件准确,避免误删。
- 日志追踪:通过日志记录,确保操作可审计。
- 软删除机制:在某些业务场景下,保留删除记录比直接物理删除更安全。
- 扩展场景:可以结合分页、权限管理等,进一步完善增删改查功能。
相关文章:
深入解析 Django 中数据删除的最佳实践:以动态管理镜像版本为例
文章目录 引言场景与模型设计场景描述 删除操作详解1. 删除单个 Tag2. 批量删除 Tags3. 删除前确认4. 日志记录 高阶优化与问题分析1. 外键约束与误删保护2. 并发删除的冲突处理3. 使用软删除 结合 Django Admin 的实现总结与实践思考 引言 在现代应用开发中,服务和…...
【java】sdkman-java多环境切换工具
#java #env #sdk #lcshand 首先我们来复习一下,可参考我原来的文章: python多个版本的切换可用pyenv nodejs多个版本的切换可用nvm 同样,java多个版本的切换可用sdkman和jenv,我偏重于使用sdkman,因为有时候我也需要…...
11.25c++继承、多态
练习: 编写一个 武器类 class Weapon{int atk; }编写3个武器派生类:短剑,斧头,长剑 class knife{int spd; }class axe{int hp; }class sword{int def; }编写一个英雄类 class Hero{int atk;int def;int spd;int hp; public:所有的…...

STM32F103外部中断配置
一、外部中断 在上一节我们介绍了STM32f103的嵌套向量中断控制器,其中包括中断的使能、失能、中断优先级分组以及中断优先级配置等内容。 1.1 外部中断/事件控制器 在STM32f103支持的60个可屏蔽中断中,有一些比较特殊的中断: 中断编号13 EXTI…...

阿里电商大整合,驶向价值竞争新航道
阿里一出手就是王炸。11月21日,阿里公布了最新动作:将国内和海外电商业务整合,成立新的电商事业群。这是阿里首次将所有电商业务整合到一起,也对电商行业未来发展有着借鉴意义。阿里为何要这么干?未来又将给行业带来哪…...
等保测评在云计算方面的应用讲解
等保测评(信息安全等级保护测评)在云计算方面的应用主要聚焦于如何满足等级保护相关要求,并确保云计算平台及其上运行的业务系统的安全性。以下是主要内容的讲解: 1. 云计算中的等保测评概述 等保测评是在我国网络安全等级保护制…...

QML TableView 实例演示 + 可能遇到的一些问题(Qt_6_5_3)
一、可能遇到的一些问题 Q1:如何禁用拖动? 在TableView下加一句代码即可: interactive: false 补充:这个属性并不专属于TableView,而是一个通用属性。很多Controls下的控件都可以使用,其主要作用就是控…...
SpringBoot(三十九)SpringBoot集成RabbitMQ实现流量削峰添谷
前边我们有具体的学习过RabbitMQ的安装和基本使用的情况。 但是呢,没有演示具体应用到项目中的实例。 这里使用RabbitMQ来实现流量的削峰添谷。 一:添加pom依赖 <!--rabbitmq-需要的 AMQP 依赖--> <dependency><groupId>org.springfr…...
前端 Vue 3 后端 Node.js 和Express 结合cursor常见提示词结构
cursor 提示词 后端提示词 请为我开发一个基于 Node.js 和Express 框架的 Todo List 后端项目。项目需要实现以下四个 RESTful API 接口: 查询所有待办事项 接口名: GET /api/get-todo功能: 从数据库的’list’集合中查询并返回所有待办事项参数: 无返回: 包含所…...

类和对象(下):点亮编程星河的类与对象进阶之光
再探构造函数 在实现构造函数时,对成员变量进行初始化主要有两种方式: 一种是常见的在函数体内赋值进行初始化;另一种则是通过初始化列表来完成初始化。 之前我们在构造函数中经常采用在函数体内对成员变量赋值的方式来给予它们初始值。例如&…...

42.接雨水
目录 题目过程解法 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 过程 发现有特殊情况就是,最高峰的地方,如果右边小于他,然后再右边也都很小的话,…...
使用Java代码操作Kafka(五):Kafka消费 offset API,包含指定 Offset 消费以及指定时间消费
文章目录 1、指定 Offset 消费2、指定时间消费 1、指定 Offset 消费 auto.offset.reset earliest | latest | none 默认是 latest (1)earliest:自动将偏移量重置为最早的偏移量,–from-beginning (2)lates…...

Ubuntu安装不同版本的opencv,并任意切换使用
参考: opencv笔记:ubuntu安装opencv以及多版本共存 | 高深远的博客 https://zhuanlan.zhihu.com/p/604658181 安装不同版本opencv及共存、切换并验证。_pkg-config opencv --modversion-CSDN博客 Ubuntu下多版本OpenCV共存和切换_ubuntu20如同时安装o…...

突破内存限制:Mac Mini M2 服务器化实践指南
本篇文章,我们聊聊如何使用 Mac Mini M2 来实现比上篇文章性价比更高的内存服务器使用,分享背后的一些小的思考。 希望对有类似需求的你有帮助。 写在前面 在上文《ThinkPad Redis:构建亿级数据毫秒级查询的平民方案》中,我们…...

【排版教程】Word、WPS 分节符(奇数页等) 自动变成 分节符(下一页) 解决办法
毕业设计排版时,一般要求每章节的起始页为奇数页,空白页不显示页眉和页脚。具体做法如下: 1 Word 在一个章节的内容完成后,在【布局】中,点击【分隔符】,然后选择【奇数页】 这样在下一章节开始的时&…...

【在Linux世界中追寻伟大的One Piece】多线程(二)
目录 1 -> 分离线程 2 -> Linux线程互斥 2.1 -> 进程线程间的互斥相关背景概念 2.2 -> 互斥量mutex 2.3 -> 互斥量的接口 2.4 -> 互斥量实现原理探究 3 -> 可重入VS线程安全 3.1 -> 概念 3.2 -> 常见的线程不安全的情况 3.3 -> 常见的…...

flink学习(8)——窗口函数
增量聚合函数 ——指窗口每进入一条数据就计算一次 例如:要计算数字之和,进去一个12 计算结果为20, 再进入一个7 ——结果为27 reduce aggregate(aggregateFunction) package com.bigdata.day04;public class _04_agg函数 {public static …...

「实战应用」如何用图表控件LightningChart .NET实现散点图?(一)
LightningChart .NET完全由GPU加速,并且性能经过优化,可用于实时显示海量数据-超过10亿个数据点。 LightningChart包括广泛的2D,高级3D,Polar,Smith,3D饼/甜甜圈,地理地图和GIS图表以及适用于科…...

鸿蒙Native使用Demo
DevecoStudio使用Native 今天,给大家带来的是关于DevecoStudio中使用Native进行开发 个人拙见:为什么要使用Native?无论是JS还是TS在复杂的情况下运行速度,肯定不如直接操作内存的C/C的运行速度快,所以,会选择使用Native;这里面的过程是什么?通过映射转化,使用napi提供的接口…...

29.UE5蓝图的网络通讯,多人自定义事件,变量同步
3-9 蓝图的网络通讯、多人自定义事件、变量同步_哔哩哔哩_bilibili 目录 1.网络通讯 1.1玩家Pawn之间的同步 1.2事件同步 1.3UI同步 1.4组播 1.5变量同步 1.网络通讯 1.1玩家Pawn之间的同步 创建一个第三人称项目 将网络模式更改为监听服务器,即将房主作为…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...