Django 简明教程

Django – Delete Data

Django ORM 是 Django 框架的一项重要功能。它是模型类与其映射的数据库表之间交互的抽象层。模型类的实例对应于表中的一行。我们可以在对象上执行所有 CRUD 操作;它会自动反映在其映射的行中。

在本章中,我们将介绍如何删除一个对象,从而在一个关系数据库中删除一行已经存在的行。

我们将使用下面给出的 Dreamreal model 作为本次练习:

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)

假设您已经执行了迁移,并在模型中添加了一些对象。

Delete Object From Shell

Django 有一项有用的功能,您可以用它在 Django 项目的环境中调用 Python Shell。

使用带有 manage.py 脚本的 shell command

python manage.py shell

在 Python 提示符之前,导入 Dreamreal model

>>> from myapp.models import Dreamreal

您可以使用 delete() method 从模型中删除一个或多个对象。此方法可以应用于包含多个对象的 QuerySet,也可以应用于单个实例。

要删除单个对象,请从 objects() 管理器的 get() method 中的模型中进行删除:

row = Dreamreal.objects.get(pk = 1)

您现在可以调用 delete() method

row.delete()

以下语句返回一个 QuerySet,其中对象的名称以 a 开始:

rows = Dreamreal.objects.filter(name__startswith = 'a')

您可以通过调用 queryset 上的 delete() 方法来执行批量删除操作:

rows.delete()

Django 返回已删除的对象数和一个字典,其中包含每种对象类型的删除数。

对于相关表,Django 的 ForeignKey 默认模拟 SQL 约束 ON DELETE CASCADE。换句话说,任何具有指向要删除的对象的外键的对象将与其一起被删除。

Perform Delete Operation by Calling a View Function

现在,让我们通过调用视图函数来执行删除操作。在 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 服务器并访问 http://localhost:8000/myapp/delete/2 。服务器将以删除成功的消息进行响应。

如果您想访问具有给定名称而不是主键的对象,请对 delete() view 中的内容进行以下更改:

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 操作必须谨慎执行,因为您可能会意外删除您不想删除的数据。因此,我们可以向用户索要确认。为此目的,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)

模板文件夹中的 myform.html 有两个按钮。 submit button 会将数据反馈发布到 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>")
django delete data 1

如果用户按下取消按钮, cancel() view 会显示此消息−

django delete data 2

否则,该记录将从表中删除。

The DeleteView Class

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')]

通过访问 http://localhost:8000/myapp/deleteview/2 URL 检查所需的记录是否已删除。

在本章中,我们解释了如何使用不同方法从 Django 模型中删除数据。