当前位置:   article > 正文

【Django 网页Web开发】05. 数据库操作,实战用户管理(保姆级图文)_数据库页面操作模块

数据库页面操作模块


欢迎关注 『Django 网页Web开发』 系列,持续更新中
欢迎关注 『Django 网页Web开发』 系列,持续更新中

1. 安装第三方模块

pip install mysqlclient
  • 1

在这里插入图片描述


2. ORM

ORM功能:

  • 创建、修改、删除数据库中的表(不用你写SQL语句)。 【无法创建数据库】

  • 操作表中的数据(不用写SQL语句)。

简单来说,ORM可以理解为普通话 ,sql语句是方言,ORM是一种sql语句的翻译,主要缺点是不能创建数据库,优点是书写起来简单高效。(运行效率不保证)

2.1 自己手动创建数据库

  • 启动MySQL服务

  • 自带工具创建数据库

    • 使用命令行创建
      先mysql登录
      然后输入命令
create database 数据库名 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
create database day15 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
  • 1
  • 2
  • 使用navicat等工具创建(注意创建数据库字符集 排列规则)
    在这里插入图片描述

2.2 django连接数据库

在项目的setting.py中修改数据库配置DATABASES

# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 驱动
        'NAME': 'day15',  # 数据库名字
        'USER': 'root',  # mysql用户名
        'PASSWORD': '123456',  # mysql密码
        'HOST': '127.0.0.1',  # 本机安装了MySQL
        'PORT': 3306,  # 端口
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这里插入图片描述

2.3 建表语句写在哪里?

所有的操作都需要在已经注册的app中的moudle.py中编写ORM语句,如下图app01就是已经注册好的,编写其中的moudle.py
在这里插入图片描述

2.4 建表语句写好后如何运行生效?

在项目根目录(根目录下有一个manage.py的文件,在最外层)下cmd执行下方代码,按照注册的app顺序从上到下依次执行各个app的moudle.py文件。

python manage.py makemigrations
python manage.py migrate
  • 1
  • 2
  • makemigrations说明:
  • 记录我们对models.py的所有改动,并且将这个改动迁移到migrations这个文件下生成一个文件,相当于一个缓冲改动,但是此时不会真的影响我们的数据库。
  • 作用区域:所有app
python manage.py makemigrations
  • 1

执行成功后出现文件夹内容:
在这里插入图片描述

  • migrate 说明:
  • 这些改动作用到数据库也就是执行migrations里面新改动的迁移文件更新数据库,比如创建数据表,或者增加字段属性
  • 作用区域:所有app
python manage.py migrate
  • 1
  • 如果要想仅仅对部分app进行作用的话 则执行如下命令:
python manage.py makemigrations appname
python manage.py migrate appname
  • 1
  • 2
  • 如果要想精确到某一个迁移文件则可以使用:
python manage.py migrate appname 文件名
  • 1

3. 操作表

注意,我们的app注册列表默认有很多官方默认的app,因此第一次操作数据库也会生成很多官方内置的表,我们学习时只需要关注自己新建的表即可。
在这里插入图片描述

3.1 创建数据表

  • moudle.py内容
from django.db import models

class UserInfo(models.Model):#一个类就是一个表
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
# 上面的UserInfo代码等价于下面的代码
# CREATE TABLE `app01_userinfo`  (
#   `id` bigint NOT NULL AUTO_INCREMENT,
#   `name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
#   `password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
#   PRIMARY KEY (`id`) USING BTREE
# )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述
观察新建的表,默认给我们添加一个id主键
在这里插入图片描述

3.2 修改数据表

在表中新增列时,由于已存在列中可能已有数据,所以新增列必须要指定新增列对应的数据:

  • 1,手动输入一个值。

  • 设置默认值

    age = models.IntegerField(default=2)
    
    • 1
  • 允许为空

    data = models.IntegerField(null=True, blank=True)
    
    • 1
  • moudle.py内容

from django.db import models

class UserInfo(models.Model):#一个类就是一个表
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField(default=2)#新增了这一列
# 上面的UserInfo代码等价于下面的代码
# CREATE TABLE `app01_userinfo`  (
#   `id` bigint NOT NULL AUTO_INCREMENT,
#   `name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
#   `password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
#   `age` int NOT NULL,
#   PRIMARY KEY (`id`) USING BTREE
# )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在这里插入图片描述


4. 操作数据

4.1 插入数据

先新建一个部门表,然后再执行插入数据,不然会报错不存在部门表,这一步要分开来操作两次。

  • moudle.py内容
from django.db import models


class UserInfo(models.Model):#一个类就是一个表
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField(default=2)#新增了这一列

class Department(models.Model):# 新建一个部门类
    title = models.CharField(max_length=16)#部门名称
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

-执行cmd命令建表后
在这里插入图片描述

  • moudle.py内容
from django.db import models


class UserInfo(models.Model):#一个类就是一个表
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField(default=2)#新增了这一列

class Department(models.Model):# 新建一个部门类
    title = models.CharField(max_length=16)#部门名称

# #### 1.插入数据 ####
Department.objects.create(title="销售部")
Department.objects.create(title="IT部")
Department.objects.create(title="运营部")
UserInfo.objects.create(name="武沛齐", password="123", age=19)
UserInfo.objects.create(name="朱虎飞", password="666", age=29)
UserInfo.objects.create(name="吴阳军", password="666")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在这里插入图片描述

4.2 删除数据

一般情况下,建议新建一个orm网页用于快速测试,避免繁琐的使用命令行,这样只需要打开orm即可执行语句
在这里插入图片描述
在这里插入图片描述
这里注意,不能在moudle.py中删除数据,会报错django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet. 原因未知。
在这里插入图片描述

  • view.py内容
    在这里插入图片描述
from app01.models import Department, UserInfo
def orm(request):
    # #### 2.删除 ####
    UserInfo.objects.filter(id=3).delete()
    Department.objects.all().delete()
    
    return HttpResponse("成功")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

4.3 修改数据

在这里插入图片描述

  • moudle.py核心内容
# #### 3.修改数据 ####
UserInfo.objects.all().update(password=999)#把所有人的密码改为999
UserInfo.objects.filter(id=2).update(age=999)#把id为2的记录的年纪改为999
UserInfo.objects.filter(name="朱虎飞").update(age=999)#把name为朱虎飞的记录年纪改为999
  • 1
  • 2
  • 3
  • 4

4.4 查询数据

  • moudle.py内容
from django.db import models


class UserInfo(models.Model):#一个类就是一个表
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField(default=2)#新增了这一列

class Department(models.Model):# 新建一个部门类
    title = models.CharField(max_length=16)#部门名称

# #### 4.查询数据 ####
# 4.1 获取符合条件的所有数据
# data_list = [对象,对象,对象]  QuerySet类型
data_list = UserInfo.objects.all()#一个数据列表
print("遍历打印所有")
for obj in data_list:#
    print(obj.id, obj.name, obj.password, obj.age)

#data_list = [对象,]
data_list = UserInfo.objects.filter(id=1)
print(data_list)#打印第一条
#4.2 获取第一条数据【对象】
row_obj = UserInfo.objects.filter(id=1).first()
print("打印row_obj的各列数据")
print(row_obj.id, row_obj.name, row_obj.password, row_obj.age)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

在这里插入图片描述


5. 实战:用户管理

url.py 添加url

    # 案例:用户管理
    path('info/list/', views.info_list),#展示用户列表

    path('info/add/', views.info_add),#添加用户

    path('info/delete/', views.info_delete),#删除用户

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

5.1 用户展示

  • view.py 获取数据并返回data_list
def info_list(request):
    # 1.获取数据库中所有的用户信息
    # [对象,对象,对象]
    data_list = UserInfo.objects.all()

    # 2.渲染,返回给用户
    return render(request, "info_list.html", {"data_list": data_list})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • info_list.html 内容
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>INFO列表</h1>


<table border="1">
    <thead>
    <tr>
        <th>ID</th>
        <th>姓名</th>
        <th>密码</th>
        <th>年龄</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    {% for obj in data_list %}
        <tr>
            <td>{{ obj.id }}</td>
            <td>{{ obj.name }}</td>
            <td>{{ obj.password }}</td>
            <td>{{ obj.age }}</td>
        </tr>
    {% endfor %}
    </tbody>
</table>


</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

在这里插入图片描述

5.2 用户添加

修改原来的用户展示列表,新增一个添加用户按钮<a href="/info/add/">添加</a>,用于跳转到用户添加页面

  • info_list.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>INFO列表</h1>

<a href="/info/add/">添加</a>

<table border="1">
    <thead>
    <tr>
        <th>ID</th>
        <th>姓名</th>
        <th>密码</th>
        <th>年龄</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    {% for obj in data_list %}
        <tr>
            <td>{{ obj.id }}</td>
            <td>{{ obj.name }}</td>
            <td>{{ obj.password }}</td>
            <td>{{ obj.age }}</td>
        </tr>
    {% endfor %}
    </tbody>
</table>


</body>
</html>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

在这里插入图片描述

  • view.py 获取表单传来的值,并将之写入数据库后跳转回到用户展示列表
def info_add(request):
    if request.method == "GET":
        return render(request, 'info_add.html')

    # 获取用户提交的数据
    user = request.POST.get("user")
    pwd = request.POST.get("pwd")
    age = request.POST.get("age")

    # 添加到数据库
    UserInfo.objects.create(name=user, password=pwd, age=age)

    # 自动跳转
    # return redirect("http://127.0.0.1:8000/info/list/")
    return redirect("/info/list/")#上一行写法的简化
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • info_add.html 内容
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>添加用户</h1>
<form method="post">
    {% csrf_token %} {# 注意不要忘了csrf!!! #}
    <input type="text" name="user" placeholder="用户名">
    <input type="text" name="pwd" placeholder="密码">
    <input type="text" name="age" placeholder="年龄">
    <input type="submit" value="提交">
</form>


</body>
</html>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

在这里插入图片描述

5.3 用户删除

修改原来的用户展示列表,新增一个添加用户按钮<a href="/info/delete/?nid={{ obj.id }}">删除</a>,用于删除用户

  • info_list.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>INFO列表</h1>

<a href="/info/add/">添加</a>

<table border="1">
    <thead>
    <tr>
        <th>ID</th>
        <th>姓名</th>
        <th>密码</th>
        <th>年龄</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    {% for obj in data_list %}
        <tr>
            <td>{{ obj.id }}</td>
            <td>{{ obj.name }}</td>
            <td>{{ obj.password }}</td>
            <td>{{ obj.age }}</td>
            <td>
                <a href="/info/delete/?nid={{ obj.id }}">删除</a>
            </td>
        </tr>
    {% endfor %}
    </tbody>
</table>


</body>
</html>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

在这里插入图片描述

  • view.py
# http://127.0.0.1:8000/info/delete/?nid=1
# http://127.0.0.1:8000/info/delete/?nid=2
# http://127.0.0.1:8000/info/delete/?nid=3
def info_delete(request):
    nid = request.GET.get('nid')#获取get传来的id
    UserInfo.objects.filter(id=nid).delete()#根据指定id删除
    return redirect("/info/list/")#跳转回到用户列表页面
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

总结

大家喜欢的话,给个

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/704251
推荐阅读
相关标签