深入解析 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 项目中,数据删除需要注意以下几点:

  1. 精确筛选:确保查询条件准确,避免误删。
  2. 日志追踪:通过日志记录,确保操作可审计。
  3. 软删除机制:在某些业务场景下,保留删除记录比直接物理删除更安全。
  4. 扩展场景:可以结合分页、权限管理等,进一步完善增删改查功能。

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

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

相关文章

otter 扩展

参见otter官方的说明:数据处理自定义,比如Extract , Transform的数据处理. 目前Select/Load不支持数据自定义处理。 Extract模块: 1.EventProcessor : 自定义数据处理,可以改变一条变更数据的任意内容。 2.FileResolver : 解决数…

STM32的CAN波特率计算

公式: CAN波特率 APB总线频率 / (BRP分频器 1)/ (SWJ BS1 BS2) SWJ一般为1。 例如STM32F407的,CAN1和CAN2都在在APB1下,频率是42000000 如果想配置成1M波特率,则计算公式为:

Z2400039基于Java-+ SpringBoot + vue 企业信息管理系统的设计与实现(源码 配置 PPT 文档 分享)

企业信息管理系统 1.项目描述2.项目结构后端(Spring Boot)前端(Vue.js Element UI) 2. 功能实现登录页首页系统管理岗位管理部门管理 3. 部署和运行注意事项 4.界面展示5.源码获取 1.项目描述 基于你的描述,这个项目…

hhdb数据库介绍(10-20)

监控 监控面板 监控面板为用户提供计算节点、服务器相关的监控功能,包含:计算节点服务状态、计算节点流量、计算节点服务器资源、其他服务器资源。 数据采集说明: 监控面板显示24小时内采集的数据(需要放大显示,正…

python学习——什么是集合

在 Python 中,集合(Set)是一种内置的数据类型,用于存储不重复的元素集合。集合中的元素必须是不可变(immutable)的,例如整数、浮点数、字符串、元组等,但是集合本身是可变的&#xf…

Java面向对象. 多态

目录 java多态是什么东西?首先要理解什么是多态 Java多态指同一行为具有多个不同表现形式。如父类引用指向子类对象,调用重写方法时呈现不同结果。 1.多态的概念 一、多态的基本概念 二、多态的实现方式 接口实现 三、多态的好处 提高代码的可扩展…

医学机器学习:数据预处理、超参数调优与模型比较的实用分析

摘要 本文介绍了医学中的机器学习,重点阐述了数据预处理、超参数调优和模型比较的技术。在数据预处理方面,包括数据收集与整理、处理缺失值、特征工程等内容,以确保数据质量和可用性。超参数调优对模型性能至关重要,介绍了多种调…

SystemUI 下拉框 Build 版本信息去掉

需求及场景 去掉SystemUI 下拉框 Build 版本信息 如下图所示:去掉 12 (SP1A.201812.016) 了解 去掉之前我们先了解它是个什么东西:其实就是一个Build RTM 信息显示 Android_12_build_SP1A.210812.016 修改文件 /frameworks/base/packages/Syste…

transformer学习笔记-词嵌入embedding原理

.在学习transformer的时候,可以看到,输入通常需要对词token进行embedding处理,如果没有先了解embedding的原理可能会有疑问,这个embedding,到底怎么来的,怎么就把一个token 变成一个矩阵,这个矩…

Apache Airflow 快速入门教程

Apache Airflow已经成为Python生态系统中管道编排的事实上的库。与类似的解决方案相反,由于它的简单性和可扩展性,它已经获得了普及。在本文中,我将尝试概述它的主要概念,并让您清楚地了解何时以及如何使用它。 Airflow应用场景 …

python+django自动化部署日志采用‌WebSocket前端实时展示

一、开发环境搭建和配置 # channels是一个用于在Django中实现WebSocket、HTTP/2和其他异步协议的库。 pip install channels#channels-redis是一个用于在Django Channels中使用Redis作为后台存储的库。它可以用于处理#WebSocket连接的持久化和消息传递。 pip install channels…

[MySQL]流程控制语句

流程控制语句需要借助存储过程才有效。关于存储过程,我会在后续的文章详述,本篇文章只是阐述流程控制语句。因此,大家只需要注意存储过程中相应的流程控制语句即可。 如果文中阐述不全或不对的,多多交流。 参考笔记三&#xff0c…

使用 pycharm 新建使用 conda 虚拟 python 环境的工程

1. conda 常见命令复习: conda env list // 查看 conda 环境列表 conda activate xxxenv // 进入指定 conda 环境2. 环境展示: 2.1. 我的物理环境的 Python 版本为 3.10.9: 2.2. 我的 conda 虚拟环境 env_yolov9_python_3_8 中的 pyth…

上传镜像docker hub登不上和docker desktop的etx4.vhdx占用空间很大等解决办法

平时使用docker一般都在Linux服务器上,但这次需要将镜像上传到docker hub上,但是服务器上一直无法登录本人的账号,(这里的问题应该docker 网络配置中没有开代理的问题,因服务器上有其他用户使用,不可能直接…

混乱原理与程序设计。

混乱原理就是:对于每一种管控方案,都会对应到一个规模极限和一个效率适配范围;所谓规模极限,就是超过极限就必然会发生失控、产生混乱;适配效率是指极限规模增加必然导致效率降低、成本增加。 在开发语言中&#xff0c…

时频转换 | Matlab基于S变换S-transform一维数据转二维图像方法

目录 基本介绍程序设计参考资料获取方式基本介绍 时频转换 | Matlab基于S变换S-transform一维数据转二维图像方法 程序设计 clear clc % close all load x.mat % 导入数据 x =

【娱乐项目】竖式算术器

Demo介绍 一个加减法随机数生成器,它能够生成随机的加减法题目,并且支持用户输入答案。系统会根据用户输入的答案判断是否正确,统计正确和错误的次数,并显示历史记录和错题记录。该工具适合用于数学练习,尤其适合练习基…

Java抛出自定义运行运行

1.重新生成异常的.java文件 Empty:空 Exception:异常 加起来就是 空指针异常的文件 2.打上extends 运行的异常(异常的类型) 3.点击ctrlo,选着这两个快捷重写 4.在需要抛出异常的地方写上:th…

使用Github Action将Docker镜像转存到阿里云私有仓库,供国内服务器使用,免费易用

文章目录 一、前言二、 工具准备:三、最终效果示例四、具体步骤第一大部分是配置阿里云1. 首先登录阿里云容器镜像服务 [服务地址](https://cr.console.aliyun.com/cn-hangzhou/instances)2. 选择个人版本3. 创建 命名空间4. 进入访问凭证来查看,用户名字…

YOLO系列论文综述(从YOLOv1到YOLOv11)【第13篇:YOLOv10——实时端到端物体检测】

YOLOv10 1 摘要2 网络结构3 YOLOv1-v10对比 YOLO系列博文: 【第1篇:概述物体检测算法发展史、YOLO应用领域、评价指标和NMS】【第2篇:YOLO系列论文、代码和主要优缺点汇总】【第3篇:YOLOv1——YOLO的开山之作】【第4篇&#xff1a…