前文

Django 实战 (1)—— 创建第一个Django项目
Django 实战 (2)—— 视图与 URL 配置
Django 实战 (3)—— Django 是怎么处理请求的?
Django 实战 (4)——连接 MySQL

在上一篇文章中,我们对数据库数据实现了新增,但是还有删除、修改、查询呢,这里就来实现删除、修改、查询的操作,也是非常简单的

这里是我们数据库中的数据

删除数据

在 views.py 中编写以下代码

from django.http import HttpResponse
from webapp.models import Test

def delete(request):
    Test.objects.filter(username='Lisa').delete()      # 根据姓名删除数据
    return HttpResponse("删除数据成功")

注意: 如果执行该操作 objects.all().delete(),将返回空值

接着,打开 urls.py 编写以下代码

from webapp import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/',hello),
    path('delete/',views.delete)
]

OK.,代码编写完成,我们测试一下能否删除数据了,启动一下 Django 项目,访问 http://127.0.0.1:8000/delete/

OK,页面显示说我们已经成功删除数据,我们刷新一下数据库看下

OK,已经删除了

其实这代码转换成 SQL 的话就是:delete from 表名 where username = 'Lisa’

修改数据

修改数据也是非常简单

这里我们以修改 username 为例,就把 django 修改为 Django 吧。同样的,我们需要在 views.py(其实不限定的哈,你可以自定义一个文件来写业务代码,这里只是为了演示而已) 中编写代码

from django.http import HttpResponse
from webapp.models import Test

def update(request):
    user = Test.objects.get(username="django")         # 原本的用户名为 django
    user.username = "Django"                           # 修改后的用户名为 Django
    return HttpResponse("修改数据成功")

在 urls.py 中新增代码如下:

from webapp import views

urlpatterns = [
    path('update',views.update)
]

重启服务,访问一下 http://127.0.0.1:8000/update/

OK,说明我们修改数据成功了,我们刷新一下数据库看下是不是 把 django 修改为 Django 了

怎么回事???怎么没修改到?是报错了吗?我们看下控制台

没有啊,控制台显示访问正常啊,那怎么没修改到数据呢?不慌,我们来分析一下

user = Test.objects.get(username="django")         # 原本的用户名为 django
user.username = "Django"                           # 修改后的用户名为 Django
  • 首先第一行代码我们是查询用户名为 django 的用户,转换成 SQL 就是 select id,username,password from 表名 where username = ‘django’
  • 第二行代码才是我们要修改的的数据,转换为 SQL 就是 update 表名 set username = ‘Django’ where username = ‘django’

所以我们还需要一个保存的操作,也就是在代码中增加一句保存操作的代码,如下:

def update(request):
    user = Test.objects.get(username="django")         # 原本的用户名为 django
    user.username = "Django"                           # 修改后的用户名为 Django
    user.save()                                        # 保存操作
    return HttpResponse("修改数据成功")

重启服务,再次访问 http://127.0.0.1:8000/update/

我们再刷新一下数据库

OK,已经修改数据成功,但是这种做法好像不太聪明的样子,就没有一行代码搞定的那种吗?我们可以是直接使用 filter 来过滤然后使用 update函数,如下:

def update(request):
    user = Test.objects.filter(id=1).update(username='Django') # 将用户名为 django 的用户修改为 Django
    return HttpResponse("修改数据成功")

这段代码与上面的效果一样,转化为SQL是:update 表名 set username = ‘Django’ where id = 1
但是与之等同的 SQL 语句变得更高效,并且不会引起竞争条件

说明: update() 方法会返回一个整型数值,表示受影响的记录条数

比如我们打印一下 user,表示一条数据受影响了

查询数据

all()

查询所有数据,返回的是有个 QuerySet 集合

def selectAll(request):
    user_list = Test.objects.all() # 查询所有字段

filter()

如果只需要删除部分的数据,就不需要调用all()方法

def selectAll(request):
	user = Test.objects.filter(username='Django') # 根据条件查询

这里只讲述这两个方法,关于其他的方法朋友们可以查阅一下官方文档
为了更好的演示查询,我们编写一个 html 网页来测试一下吧,我们创建项目的时候会有一个 templates 模板,这是一个可以存放 html 页面的文件夹,我们在该文件夹下创建一个 html 文件吧

html 代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户列表</title>
</head>
<body>
    <table border="1" style="width: 100%">
        <tr style="text-align: center">
            <td>用户ID</td>
            <td>用户名</td>
            <td>用户密码</td>
        </tr>

        <!--使用迭代器循环遍历获取值-->
        {% for user in user %}
        <tr style="text-align: center">
            <td>{{ user.id }}</td>
            <td>{{ user.username }}</td>
            <td>{{ user.password }}</td>
        </tr>
        {% endfor %}
    </table>
</body>
</html>

说明:上面的代码中比较新颖的地方就是下面这段代码了

{% for user in user %}
	<tr style="text-align: center">
		<td>{{ user.id }}</td>
		<td>{{ user.username }}</td>
		<td>{{ user.password }}</td>
	</tr>
{% endfor %}

其实就是下面这段代码有点难理解而已,这是一个组合,相当于 html 中的标签,有个开标签({% for 迭代名 in 被迭代名 %})还需要有个闭标签({% endfor %}

{% for 迭代名 in 被迭代名 %}

{% endfor %}

其实这段代码也并不难理解,这其实跟 for 循环没什么区别

for i in item:
	print(i)

所以这段代码就是把 user 中的信息迭代显示在 html 页面上,那么这个被 迭代的 user 是从哪里得到的数据呢?

{% for user in user %}
	<tr style="text-align: center">
		<td>{{ user.id }}</td>
		<td>{{ user.username }}</td>
		<td>{{ user.password }}</td>
	</tr>
{% endfor %}

是从我们在 views.py 文件中定义来的

from django.shortcuts import render
from webapp.models import Test

def selectAll(request):
    user_list = Test.objects.all() # 查询所有字段
    return render(request,"user.html",{'user':user_list}) # 将查询到的值赋予给user作用域

通过代码我们可以知道,我们想得到的结果集让 user_list 接受,然后 render 方法返回一个 html 页面,其中 { ‘user’ : user_list } 就是把我们 user_list 接收到的数据传给 user,从而让 html 可以得到我们传过去的值

编写完 views.py 之后我们还有修改一个 urls.py 文件

from webapp import views

urlpatterns = [
    path('insert/',views.insert),
    path('userList/',views.selectAll),
    path('delete/',views.delete),
    path('update/',views.update)
]

OK,我们重启一下服务,访问一下 http://127.0.0.1:8000/userList/


OK,这就是查询