Django中的軟刪除

軟刪除(Soft Delete)是一種數據刪除策略,它并不真正從數據庫中刪除記錄,而是通過標記(如 is_deleted 字段)來表示記錄已被刪除。

這樣做的好處是可以保留數據歷史,支持數據恢復和審計。

在 Django 里可以通過 自定義 Manager + 重寫 delete 方法 來實現。


1. 在模型里增加 is_delete 字段

from django.db import modelsclass BaseModel(models.Model):is_delete = models.BooleanField(default=False, verbose_name="是否刪除")class Meta:abstract = True  # 抽象基類,不會建表

這樣所有繼承 BaseModel 的表都有 is_delete 字段。


2. 自定義 Manager(默認過濾掉刪除的記錄)

class ActiveManager(models.Manager):def get_queryset(self):# 默認只返回 is_delete=False 的數據return super().get_queryset().filter(is_delete=False)

3. 在模型里應用 Manager

class User(BaseModel):name = models.CharField(max_length=100)# managersobjects = ActiveManager()   # 默認只取未刪除的all_objects = models.Manager()  # 需要時可以取所有(包括已刪除的)

這樣:

User.objects.all()        # 只會查 is_delete=False
User.all_objects.all()    # 不加過濾,所有數據都能查

4. 重寫 delete() 方法(軟刪除)

class User(BaseModel):name = models.CharField(max_length=100)objects = ActiveManager()all_objects = models.Manager()def delete(self, using=None, keep_parents=False):self.is_delete = Trueself.save(update_fields=['is_delete'])  # 只更新 is_delete 字段

這樣:

u = User.objects.get(id=1)
u.delete()  # 不會真正刪除,只會把 is_delete 置為 True

5. 如果要做批量刪除

Django 的 QuerySet.delete() 默認會直接刪掉數據,所以我們也可以自定義一個 QuerySet 來支持批量軟刪除:

class SoftDeleteQuerySet(models.QuerySet):def delete(self):return super().update(is_delete=True)

結合 Manager 使用:

class ActiveManager(models.Manager):def get_queryset(self):return SoftDeleteQuerySet(self.model, using=self._db).filter(is_delete=False)

這樣就支持:

User.objects.filter(name="Tom").delete()  # 也會變成軟刪除

? 總結

  1. is_delete 字段標記是否刪除。
  2. 自定義 Manager 過濾掉已刪除的數據。
  3. 重寫 delete() 實現軟刪除邏輯。
  4. 如有需要,配合自定義 QuerySet 處理批量軟刪除。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96130.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96130.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96130.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JavaEE 進階第四期:開啟前端入門之旅(四)

專欄:JavaEE 進階躍遷營 個人主頁:手握風云 目錄 一、常用CSS 1.1. border 1.2. width/height 1.3. padding:內邊距 1.4. margin:外邊距 二、初始JavaScript 2.1. JavaScript是什么 2.2. 發展歷史 2.3. JavaScript 和 HT…

學習日記-SpringMVC-day49-9.4

知識點:1.RequestMapping(3)知識點核心內容重點RequestMapping注解的parameters屬性通過parameters指定請求參數條件(如bookID),控制請求匹配規則(必須包含/排除特定參數或值)參數存…

【Day 50 】Linux-nginx反向代理與負載均衡

概述在現代 Web 架構中,Nginx 作為高并發、高性能的 HTTP 和反向代理服務器,被廣泛應用于提升服務性能、增強系統安全性和實現負載均衡。其中,反向代理能夠隱藏后端服務器信息并優化請求處理流程,負載均衡則可將請求分發到多個后端…

vue中配置 ts

在 Vue 項目中配置 TypeScript(TS)可以提升代碼的類型安全性和開發體驗。以下是在 Vue 項目(基于 Vite)中配置 TypeScript 的詳細步驟和關鍵配置: 一、創建支持 TypeScript 的 Vue 項目 如果是新建項目,推…

阿里云鏡像地址獲取,并安裝 docker的mysql和nginx等服務,java,python,ffmpeg,go等環境

阿里云那個鏡像地址獲取 阿里云鏡像加速器不是一個通用的 registry.cn-hangzhou.aliyuncs.com,而是你賬號專屬的,比如這樣: https://abcd1234.mirror.aliyuncs.com👉 登錄阿里云控制臺獲取: 阿里云鏡像加速器 然后替…

conda環境導出

1. 激活你想要打包的環境首先,確保你激活了你要打包的 conda 環境:conda activate qwen2. 導出環境配置使用 conda 命令將當前環境的配置導出為一個 .yml 文件,記錄下環境中所有的依賴和版本:conda list --export > techgpt_en…

openEuler2403安裝部署Kafka

文章目錄 openEuler2403安裝部署Kafka with KRaft一、前言1.簡介2.架構3.環境 二、正文1.部署服務器2.基礎環境1)JDK 安裝部署2)關閉防火墻 3.單機部署1)下載軟件包2)修改配置文件3)格式化存儲目錄4)單機啟…

發布工業智能體,云從科技打造制造業AI“運營大腦”

近日,在2025世界智能產業博覽會重慶市工業智能體首發儀式現場,云從科技重磅發布經營決策-產線運營智能體,為制造業的智能化轉型提供了全新的解決方案。該智能體的亮相,不僅代表著人工智能技術在工業領域的深度應用,更標…

【Linux基礎】parted命令詳解:從入門到精通的磁盤分區管理完全指南

目錄 前言 1 parted命令概述 1.1 什么是parted 1.2 parted與fdisk的對比 1.3 parted的主要優勢 2 parted命令的安裝與基本語法 2.1 在不同Linux發行版中安裝parted 2.2 parted的基本語法 2.3 parted的工作模式 3 parted交互式命令詳解 3.1 交互式操作流程 3.2 主要…

如何在路由器上配置DHCP服務器?

在路由器上配置DHCP服務器的步驟因品牌(如TP-Link、華為、小米、華碩等)略有差異,但核心流程一致,主要包括登錄管理界面、開啟DHCP功能、設置IP地址池及相關參數。以下是通用操作指南: 一、準備工作 確保電腦/手機已連…

HTML和CSS學習

HTML學習 注釋 <!-- -->組成 告訴瀏覽器我是html文件<!DOCTYPE html> <title>瀏覽器標簽</title> <body> <!--- 其中是主要內容 ---> <p> 段落 </p> </body> </html> (結束點…

OpenTenBase vs MySQL vs Oracle,企業級應用數據庫實盤對比分析

摘要 因為工作久了的緣故&#xff0c;接觸過不少數據庫。公司的管理系統用的MySQL&#xff0c;財務系統用的Oracle。隨著時代發展&#xff0c;國產開源數據庫已經在性能上能與這些國際知名頂尖數據庫品牌相媲美&#xff0c;其中OpenTenBase以其開放環境和優越性能脫穎而出&…

Oracle 備份與恢復常見的七大問題

為了最大限度保障數據的安全性&#xff0c;同時能在不可預計災難的情況下保證數據的快速恢復&#xff0c;需要根據數據的類型和重要程度制定相應的備份和恢復方案。在這個過程中&#xff0c;DBA的職責就是要保證數據庫&#xff08;其它數據由其它崗位負責&#xff09;的高可用和…

StringBuilder類的數據結構和擴容方式解讀

目錄 StringBuilder是什么 核心特性&#xff1a; StringBuilder數據結構 1. 核心存儲結構&#xff08;基于父類 AbstractStringBuilder&#xff09; 2. 類定義與繼承關系 3. 數據結構的核心特點 StringBuilder數據結構的初始化方式 1. 無參構造&#xff1a;默認初始容量…

LangChain實戰(十七):構建與PDF/PPT文檔對話的AI助手

本文是《LangChain實戰課》系列的第十七篇,將專篇深入講解如何構建能夠與PDF和PPT文檔進行智能對話的AI助手。通過學習本文,您將掌握復雜格式文檔的解析技巧、文本與表格處理技術,以及實現精準問答的系統方法。 前言 在日常工作和學習中,PDF和PPT文檔是我們最常接觸的文檔…

魚眼相機模型

魚眼相機模型 最近涉及魚眼相機模型、標定使用等&#xff0c;作為記錄&#xff0c;更新很久不曾更新的博客。 文章目錄魚眼相機模型1 相機成像2 魚眼模型3 畸變3.1 適用針孔和MEI3.2 Kannala-Brandt魚眼模型4 代碼實現1 相機成像 針孔相機&#xff1a;所有光線從一個孔&#xf…

大語言模型提示詞工程詳盡實戰指南

引言&#xff1a;與大型語言模型&#xff08;LLM&#xff09;高效對話的藝術大型語言模型&#xff08;LLM&#xff09;——例如我們熟知的GPT系列、Claude、Llama等——在自然語言處理&#xff08;NLP&#xff09;領域展現了驚人的能力&#xff0c;能夠執行文本摘要、翻譯、代碼…

HTTP 請求體格式詳解

1. 概覽與概念 Content-Type&#xff1a;HTTP 請求/響應頭&#xff0c;表示消息體的媒體類型&#xff08;MIME type&#xff09;。服務端用它決定如何解析請求體。常見場景&#xff1a; 純結構化數據&#xff08;JSON&#xff09; → application/json表單 文件上傳 → multip…

事務設置和消息分發

事務 RabbitMQ是基于AMQP協議實現的&#xff0c;該協議實現了事務機制&#xff0c;因此RabbitMQ也支持事務機制. SpringAMQP也提供了對事務相關的操作&#xff0c;RabbitMQ事務允許開發者確保消息的發送和接收是原子性的&#xff0c;要么 全部成功&#xff0c;要么全部失敗.| 前…

Python 中 try / except / else / finally 異常處理詳解

1. 基本結構 try:# 可能會拋出異常的代碼 except SomeException as e:# 捕獲并處理異常 else:# 如果 try 中代碼沒有異常&#xff0c;就執行這里 finally:# 無論是否發生異常&#xff0c;最后都會執行這里2. 各部分的作用 try 用途&#xff1a;包含可能發生異常的代碼段。如果代…