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://127.0.0.1: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://127.0.0.1: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://127.0.0.1:8000/myapp/deleteview/2** URL 检查所需记录是否已删除。

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

广告