Django学习之orm框架

八、Django学习之orm框架


其他关于Python Web开发笔记:(如果遇到问题可以一起交流~)

一、Flask学习之HTML-CSDN博客

二、Flask学习之CSS-CSDN博客

【接上篇】二、Flask学习之CSS(下篇)-CSDN博客

三、Flask学习之BootSrap-CSDN博客

四、Flask学习之JavaScript-CSDN博客

五、Flask学习之MySQL-CSDN博客

六、Django学习之小试牛刀-CSDN博客

七、Django学习之预备知识-CSDN博客

首先安装第三方模块:

pip install mysqlclient

然后创建数据库,具体方法参见:五、Flask学习之MySQL-CSDN博客

1.Django连接数据库

打开Django项目中的settings.py文件修改配置,找到DATABASE,然后修改:

DATABASES = {
   
    "default": {
   
        "ENGINE": "django.db.backends.mysql",	# 设置MySQL引擎,Django会自动连接数据库
        "NAME": "mydatabase", 					# 你自己的数据库的名称
        "USER": "root",							# 数据库用户名
        "PASSWORD": "mypassword", 				# 你的mysql密码
        "HOST": "127.0.0.1",  					# 本机回环地址
        "PORT": 3306,       					# 数据库端口  
    }
}

2.Django对数据表操作

打开自己创建好的app下的models.py文件,输入以下语句用于创建表格:

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

Django会将这些代码转换成MySQL语句,等价于:

create table myapp01_userinfo(
    id bigint primary key auto_increment, -- Django会自动加上这一列
    name varchar(34),
    password varchar(64),
    age int
);

然后启用终端,使用你的Django项目的Python解释器环境,进入到你的项目的根目录下,输入以下代码:

python manage.py makemigrations
pyhton manage.py migrate

在运行第一条指令的时候,可能会出现django.db.utils.NotSupportedError: MySQL 8 or later is required这个报错信息,原因是你本地安装的MySQL数据库是5.0版本的而Django的新版本只支持8.0 版本的MySQL。

解决方案如下:

找到你的Django项目的Python解释器位置,然后进入以下路径:

\Lib\site-packages\django\db\backends\base

找到base.py,把第239行代码注释掉,这行代码的作用是检查你的数据库是否支持,注释掉就可以了。

image-20240128225512226

然后就能正常运行上面的两条指令了:

image-20240128230224504

然后你就会发现你的数据库多出来了很多表格:

image-20240128230351291

这些表格是Django帮你创建的。

如果你后续还要添加新的表,就在models.py里面创建好类以后,再次执行上面的两条指令就可以了。

如果你后续是在已经创建过的表格中再加入字段,会提示你有两个选项(因为有可能那张表已经有数据了),选第一个,会让你输入一个默认值,会把那张表中的新添加的字段默认值设置为你输入的;如果选第二个会直接退出程序,然后多加一个参数就可以设置默认值:age = models.IntegerField(default=999)

3.Django对数据表进行增删改查

新建一个url用来测试增删改查操作,我这里命名为orm:

在urls.py新增:

path("orm/", views.orm)

然后再views.py里面添加函数:

def orm(request):
    return HttpResponse("操作成功!")

3.1. 增

新建表数据使用的语句格式为:

# 要先导入对应的类才能操作
from myapp01.models import UserInfo
# Models里面的类名(数据表).objects.create(各种值)
# 例如:
def orm(request):
    # 1.增
    UserInfo.objects.create(name="panda", password="123465", age=20)
    UserInfo.objects.create(name="小红", password="111111", age=21)
    UserInfo.objects.create(name="小明", password="222222", age=22)
    return HttpResponse("操作成功!")

运行之后,检查数据表的数据是否已经添加上:

image-20240129120335854

3.2. 删

删除某条目的语句格式为:

# fileter()里面装的是筛选条件
UserInfo.objects.filter(id=3).delete()

删除全部条目的语句为:

UserInfo.objects.all().delete()

运行之后,检查数据表中数据是否被删除:

image-20240129120841276

3.3. 改

修改某条目的语句格式为:

UserInfo.objects.filter(id=5).update(name="大白")

运行之后,检查数据表中数据是否被修改:

在这里插入图片描述

3.4. 查

获取所有的数据:

data_list = UserInfo.objects.all()

获得的结果是一个列表,列表中的每一个元素都是一个对象,代表着数据表中的一行数据:

for each in data_list:
    print(each)

image-20240129125418459

如果想访问它的值,就可以使用.运算符:

for each in data_list:
    print(each.name, each.password, each.age)

image-20240129125548189

查询数据可以添加一定条件,比如:

data = UserInfo.objects.filter(id=5)

但是返回的结果仍然是一个列表,就算只有一条数据也是返回的列表。如果已经确定只有一条数据,那么就可以使用一下语句,返回的结果只是一个对象:

data = UserInfo.objects.filter(id=5).first()

4.案例

4.1. 显示用户列表

在urls.py新增:

path("info/list/", views.info_list)

然后再views.py里面添加函数:

def info_list(request):
    # 获取用户信息
    data_list = UserInfo.objects.all()
    return render(request, "info_list.html", {
   "data_list": data_list})

然后在templates里面新建info_list.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户列表</title>
</head>
<body>
<div>
    <table border="1">
        <thead>
        <tr>
            <th>ID</th>
            <th>用户名</th>
            <th>密码</th>
            <th>年龄</th>
        </tr>
        </thead>
        <tbody>
        {% for each in data_list %}
            <tr>
                <td>{
  { each.id }}</td>
                <td>{
  { each.name }}</td>
                <td>{
  { each.password }}</td>
                <td>{
  { each.age }}</td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
</div>
</body>
</html>

运行结果:

在这里插入图片描述

4.2. 添加用户

在urls.py新增:

path("info/add/", views.info_add)

然后再views.py里面添加函数:

def info_add(request):
    if request.method == "GET":
        return render(request, "info_add.html")
    # 获取用户提交的数据
    username = request.POST.get("username")
    passwd = request.POST.get("passwd")
    age = request.POST.get("age")
    # 添加到数据库
    UserInfo.objects.create(name=username, passwd=passwd, age=age)
    return redirect("/info/list")

然后在templates里面新建info_add.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>添加用户</h1>
<form method="post" action="/info/add/">
    {% csrf_token %}
    用户名:<input type="text" name="username" placeholder="请输入用户名......">
    密 码:<input type="password" name="passwd" placeholder="请输入密码......">
    年 龄:<input type="text" name="age" placeholder="请输入年龄......">
    <input type="submit" value="提 交">
</form>
</body>
</html>

运行结果:

image-20240129190142155

点击提交后会自动跳转:

image-20240129190315115

4.3. 删除用户

在urls.py新增:

path("info/del/", views.info_del)

然后再views.py里面添加函数:

def info_add(request):
    if request.method == "GET":
        return render(request, "info_add.html")
    # 获取用户提交的数据
    username = request.POST.get("username")
    passwd = request.POST.get("passwd")
    age = request.POST.get("age")
    # 添加到数据库
    UserInfo.objects.create(name=username, passwd=passwd, age=age)
    return redirect("/info/list")

修改templates里面的info_list.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户列表</title>
</head>
<body>
<div>
    <table border="1">
        <thead>
        <tr>
            <th>ID</th>
            <th>用户名</th>
            <th>密码</th>
            <th>年龄</th>
            <th>操作</th>
        </tr>
        </thead>
        <tbody>
        {% for each in data_list %}
            <tr>
                <td>{
  { each.id }}</td>
                <td>{
  { each.name }}</td>
                <td>{
  { each.password }}</td>
                <td>{
  { each.age }}</td>
                <td>
                    <a href="/info/del/?the_id={
  { each.id }}">删除</a>
                </td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
</div>
</body>
</html>

效果:

在这里插入图片描述

当点击删除时,会执行删除操作,并自动跳转到列表界面:

在这里插入图片描述

相关推荐

  1. Django框架学习入门

    2024-01-30 06:10:03       25 阅读
  2. Django框架request对象

    2024-01-30 06:10:03       43 阅读
  3. Django框架模型层

    2024-01-30 06:10:03       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-30 06:10:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-30 06:10:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-30 06:10:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-30 06:10:03       20 阅读

热门阅读

  1. ElasticSearch 8.x 版本如何使用 SearchRequestBuilder 检索

    2024-01-30 06:10:03       28 阅读
  2. ZK和ETCD的产品对比和差异

    2024-01-30 06:10:03       39 阅读
  3. 并查集:1250. 格子游戏

    2024-01-30 06:10:03       31 阅读
  4. Jython调用openwire库连接activemq

    2024-01-30 06:10:03       36 阅读