
- Django 基本概念
- Django - 首頁
- Django - 基礎
- Django - 概覽
- Django - 環境
- Django - 建立專案
- Django - 應用生命週期
- Django - 建立檢視
- Django - URL 對映
- Django - 首頁
- Django - 模板系統
- Django - MVT
- Django - 新增主模板
- Django 管理員
- Django 管理員 - 介面
- Django 管理員 - 建立使用者
- Django 管理員 - 包含模型
- Django 管理員 - 設定顯示欄位
- Django 管理員 - 更新物件
- Django 模型
- Django - 模型
- Django - 插入資料
- Django - 更新資料
- Django - 刪除資料
- Django - 更新模型
- Django 靜態檔案
- Django - 新增靜態檔案
- Django - 新增 CSS 檔案
- Django 高階
- Django - 頁面未找到 (404)
- Django - 頁面重定向
- Django - 傳送電子郵件
- Django - 通用檢視
- Django - 表單處理
- Django - 檔案上傳
- Django - Apache 設定
- Django - Cookie 處理
- Django - 會話
- Django - 快取
- Django - 評論
- Django - RSS
- Django - AJAX
- Django 有用資源
- Django - 快速指南
- Django - 有用資源
- Django - 討論
Django – 刪除資料
Django ORM 是 Django 框架的一個重要特性。它是在模型類與其對映的資料庫表之間互動的抽象層。模型類的例項對應於表中的一行。我們可以在物件上執行所有 CRUD 操作;它將自動反映在其對映的行中。
在本章中,我們將瞭解如何刪除物件,從而刪除關係資料庫中已存在的行。
我們將使用如下所示的 **Dreamreal 模型** 進行練習:
class Dreamreal(models.Model): website = models.CharField(max_length=50) mail = models.CharField(max_length=50) name = models.CharField(max_length=50) phonenumber = models.IntegerField() def __str__(self): return "Website: {} Email: {} Name: {} Ph.: {}".format(self.website, self.mail, self.name, self.phonenumber)
假設您已經執行了遷移並在模型中添加了一些物件。
從 Shell 刪除物件
Django 具有一個有用的功能,您可以使用它在 Django 專案的環境中呼叫 Python shell。
使用 **manage.py** 指令碼中的 **shell 命令**:
python manage.py shell
在 Python 提示符前面,匯入 **Dreamreal 模型**:
>>> from myapp.models import Dreamreal
您可以使用 **delete() 方法** 刪除模型中的一個或多個物件。此方法可以應用於包含多個物件的 QuerySet,或應用於單個例項。
要刪除單個物件,請使用物件管理器中的 **get() 方法** 從模型中刪除:
row = Dreamreal.objects.get(pk = 1)
您現在可以呼叫 **delete() 方法**:
row.delete()
以下語句返回名稱以“**a**”開頭的物件的 QuerySet:
rows = Dreamreal.objects.filter(name__startswith = 'a')
您可以透過在 queryset 上呼叫 delete() 方法來執行批次刪除操作:
rows.delete()
Django 返回已刪除的物件數量以及包含每個物件型別刪除數量的字典。
對於相關表,Django 的 ForeignKey 預設模擬 SQL 約束 ON DELETE CASCADE。換句話說,任何具有指向要刪除的物件的外部索引鍵的物件都將與它們一起被刪除。
透過呼叫檢視函式執行刪除操作
現在讓我們透過呼叫檢視函式來執行刪除操作。在 **views.py** 檔案中定義 update() 函式。
此函式從其對映的 URL 中接收主鍵作為引數。
from django.shortcuts import render from django.http import HttpResponse from myapp.models import Dreamreal def delete(request, pk): obj = Dreamreal.objects.get(pk=pk) obj.delete() return HttpResponse("Deleted successfully")
我們還需要透過新增新路徑在 **urls.py** 檔案中註冊此檢視。
urlpatterns + = [path("delete/<int:pk>", views.delete, name='delete')]
進行這些更改後,執行 Django 伺服器並訪問 **https://:8000/myapp/delete/2**。伺服器將返回已成功刪除的訊息。
如果您想訪問具有給定名稱的物件而不是主鍵,請如下更改 **delete() 檢視**:
def delete(request, name): obj = Dreamreal.objects.get(name=name) obj.delete() return HttpResponse("Deleted successfully")
還在 myapp 的 URLCONFIG 中更改 delete() 檢視的 URL 對映:
urlpatterns + = [path("delete/<name>", views.delete, name='delete')]
必須謹慎地執行刪除操作,因為您可能會意外刪除您不想刪除的資料。因此,我們可以向用戶詢問確認。為此,delete() 檢視呈現一個帶有提交和取消按鈕的表單。
def delete(request, pk): obj = Dreamreal.objects.get(pk=pk) if request.method == "POST": obj.delete() obj.save() return HttpResponse("<h2>Record updated Successfully</h2>") obj = Dreamreal.objects.get(pk=pk) context = {"pk":pk} return render(request, "myform.html", context)
templates 資料夾中的 **myform.html** 有兩個按鈕。**提交按鈕** 將回發到 delete() 檢視,並在物件上呼叫 delete() 方法:
<html> <body> <form action="../delete/{{ pk }}" method="post"> {% csrf_token %} <h2>The record with primary {{ pk }} will be deleted. Are you sure?</h2> <input type="submit" value="delete"> <a href = "../cancel"><input type="button" value="Cancel" /></a> </form> </body> </html>
新增如下所示的 cancel() 檢視:
def cancel(request): return HttpResponse("<h2>Delete operation Cancelled by the user</h2>")
訪問 **https://:8000/myapp/delete/2** URL。

如果使用者按下取消按鈕,**cancel() 檢視** 將顯示此訊息:

否則,記錄將從表中刪除。
DeleteView 類
Django 定義了一組通用檢視類。DeleteView 類專門用於執行 DELETE 查詢操作。
我們定義 DeleteView 類的子類,並將其 **template_name** 屬性設定為我們已經建立的 **myform.html**。
在 **views.py** 檔案中新增以下程式碼:
from django.views.generic.edit import DeleteView class DRDeleteView(DeleteView): model = Dreamreal template_name = "myform.html" success_url = "../success/"
**myform.html** 檔案保持不變:
<html> <body> <form method="post"> {% csrf_token %} <h2>The record will be deleted. Are you sure?</h2> <input type="submit" value="delete"> <a href = "../cancel"> <input type="button" value="Cancel" /></a> </form> </body> </html>
在 **urls.py** 檔案中新增對 DeleteView 通用類的對映:
from .views import DRDeleteView urlpatterns += [path("deleteview/<int:pk>", DRDeleteView.as_view(), name='deleteview')]
透過訪問 **https://:8000/myapp/deleteview/2** URL 檢查所需記錄是否已刪除。
在本章中,我們解釋瞭如何使用不同的方法從 Django 模型中刪除資料。