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。

Django Delete Data 1

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

Django Delete Data 2

否則,記錄將從表中刪除。

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 模型中刪除資料。

廣告