- 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://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。
如果用户按下取消按钮,**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://127.0.0.1:8000/myapp/deleteview/2** URL 检查所需记录是否已删除。
在本章中,我们解释了如何使用不同的方法从 Django 模型中删除数据。