Django学习(二):数据库操作

参考:最新Python的web开发全家桶(django+前端+数据库)

  • 相较于PyMySQL,Django操作数据库更加简单——ORM框架

    在这里插入图片描述

由此可见,ORM相当于起到了一种解释器的作用,使得在对数据库操作的代码编写更加简洁明快

1. 安装第三方模块

pip install mysqlclient

2. ORM

ORM可以帮我们做两件事:

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

2.1 自己创建数据库

命令行终端创建

create database mysql_test DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

2.2 Django连接数据库

在 【settings.py】 中进行配置和修改

在这里插入图片描述

找到DATABASES字段

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 连接数据库类型
        'NAME': 'mysql_test',                 # 数据库名
        'USER':'root',                        # 用户名
        'PASSWORD':'123456',                  # 密码
        'HOST':'127.0.0.1',                   # 主机地址
        'PORT':3306,                          # 端口
    }
}

2.3 Django表操作

2.3.1 创建表

在【models.py】文件中进行操作,在其中编写类,django会自动在数据库中进行表的创建

步骤:

  1. 在【models.py】文件中创建类

  2. 在命令行运行

    python manage.py makemigrations
    python manage.py migrate
    

例子:

## 【models.py】
class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField()

在这里插入图片描述

则django自动在数据库中以 【app名_类名小写】创建表,即等同于在mysql中执行:

create table app01_userinfo(
	id bigint auto_increment primary key,
    name varchar(32),
    password varchar(64),
	age int
)

即 类名 -> 表名 , 字段名 -> 列名

由此可见,在执行上述操作后,包括自己创建app中的类在内的所有在【settings.py】中注册的app都生成了对应的表格

在这里插入图片描述

2.3.2 删除表

直接在【models.py】删除创建的类,再执行

python manage.py makemigrations
python manage.py migrate

即可删除表

2.3.3 修改表

若要修改表内的列,直接修改类的成员即可。

若需要删除某一列,直接去掉该成员,再执行下面两条语句

python manage.py makemigrations
python manage.py migrate

【注意】在添加列的时候,因为可能已经存在历史数据,所以需要提前声明该列的默认值,或者允许添加列为空(默认值的声明也可以在执行命令行语句时被动添加),再进行命令行操作

例如:

class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField()
    level = models.IntegerField(default='2') #设置默认值
    deta = models.IntegerField(null=True,blank=True)  #允许为空

在这里插入图片描述

2.4 Django数据操作

2.4.1 添加数据

在【models.py】中编写:

类名.objects.create(1=1,2=2,...)

例子:向UserInfo中添加行:

UserInfo.objects.create(name="王大壮",password="123",age=22)
在页面中实现

在【views.py】中定义的函数之中,引入【models】模块,对其中的各个类执行上述操作

from app01 import models
def orm(request):
    #测试ORM操作表中的数据

    ## 1. 新建数据
    models.Department.objects.create(title="销售部")
    models.Department.objects.create(title="运营部")
    models.Department.objects.create(title="IT部")

    models.UserInfo.objects.create(name="王大壮", password="123", age=22)
    models.UserInfo.objects.create(name="二狗", password="666", age=6)
    models.UserInfo.objects.create(name="唐三才", password="789", age=21)
    models.UserInfo.objects.create(name="赵肆", password="789") # 由于age有默认值,可以不写

    return HttpResponse("成功")

在这里插入图片描述

2.4.2 删除数据

在【views.py】中定义的函数之中,引入【models】模块,对要操作的类,先筛选出需要删除的数据,然后执行delete()

    # 2.删除数据
    # 先筛选数据,然后执行delete()
    models.UserInfo.objects.filter(id=3).delete()
    models.Department.objects.all().delete()

在这里插入图片描述

2.4.3 获取数据

可以对类的对象使用【.filter()】和【.all()】进行筛选和全选,【.first()】可以直接获取第一个对象

    # 3.获取数据
    data_list = models.UserInfo.objects.all() # 选择所有数据
    # 返回的data_list是QuerySet类型,可以看作一种数据列表:[行(对象),行(对象),行(对象),...]
    print(data_list)
    for obj in data_list:
        print(obj.id,obj.name,obj.password,obj.age)

    user_data = models.UserInfo.objects.filter(id=1)#可以使用过滤器来选择想要的数据,过滤器依然返回 QuerySet 即使其只有一个数据
    user_data = models.UserInfo.objects.filter(id=1).first() #使用first()可以直接取到第一个对象
    print(user_data.id, user_data.name, user_data.password, user_data.age)

在这里插入图片描述

2.4.4 更新数据

对数据进行筛选后,使用【.update()】函数进行修改

    # 4.更新数据
    models.UserInfo.objects.all().update(password=999)
    models.UserInfo.objects.filter(name='赵肆').update(age=44)

在这里插入图片描述

3. 案例:用户管理

3.1 展示用户列表

  • url

  • 函数

    1. 获取数据库中所有用户信息

    2. 渲染,传值给页面

#【urls.py】
urlpatterns = [
    path('info/list/', views.info_list),
]
#【views.py】
from app01.models import UserInfo
def info_list(request):
    # 1. 获取数据库中所有用户信息
    # [对象,对象,对象,...]
    data_list = UserInfo.objects.all()

    # 2. 渲染,传值给页面
    return render(request,'info_list.html',{'data_list':data_list})

<!-- 【info_list.html】 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Info列表</title>
</head>
<body>
    <h1>Info列表</h1>
    <table border = '1'>
        <thead>
            <tr>
                <th>ID</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>

在这里插入图片描述

3.2 添加用户

  • url

  • 函数

    1. GET,看到页面,添加内容

    2. POST,提交->写入数据库

#【urls.py】
urlpatterns = [
	path('info/add/', views.info_add),
]
#【views.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("/info/list/") #自动跳转到info_list

<!-- 【info_add.html】 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加用户</title>
</head>
<body>
    <h1>添加用户</h1>
    <form method="post" action="/info/add/"><!--post当前页面时,action可以不写-->

        {% csrf_token %} <!-- 别忘了!! -->

        <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>

在这里插入图片描述

3.3 删除用户

  • url

  • 函数

    1. 通过url传递nid

    2. get获取nid,删除用户

实现

  1. 对用户列表页面html进行一些修改
<!-- 【info_list.html】 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Info列表</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>
                    <td>
                        <a href="/info/delete/?nid={{ obj.id }}">删除</a><!--将本数据的id在跳转时传入delete页面-->
                    </td>
                </tr>
            {% endfor %}
        </tbody>

    </table>

    <a href="/info/add/">添加</a> <!--实现添加用户页面的跳转-->
</body>
</html>
  1. 建立连接
#【urls.py】
urlpatterns = [
	path('info/delete/', views.info_delete),
]
  1. 根据跳转传入的nid删除数据
#【views.py】
def info_delete(request):
    nid = request.GET.get('nid')
    UserInfo.objects.filter(id=nid).delete()
    return redirect("/info/list/")  # 自动跳转到info_list

效果

删除前

在这里插入图片描述

删除后

在这里插入图片描述

数据库中也已经删除

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值