参考:最新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

效果

删除前

删除后

数据库中也已经删除

Django学习(二):数据库操作相关推荐

  1. 关于Django中的数据库操作API之distinct去重的一个误传

    django提供的数据库操作API中的distinct()函数,了解SQL语句的读者都应该知道,DISTINCT关键字可以在select操作时去重.django里的这个distinct()函数也是这个 ...

  2. Django模型之数据库操作-查询

    六.数据库操作-查询 6.1基础条件查询 1 基本查询 get查询单一结果,如果不存在会抛出模型类.DoesNotExist异常. all查询多个结果.[返回的所有结果是列表] count查询结果数量 ...

  3. Django框架之数据库操作

    文章目录 一.前言 二.数据库配置 三.数据表创建 1.单表创建 2.关联表创建 四.ORM增删改查 1.新增数据(C) (1)创建单表数据 (2)创建从表数据 2.读取数据(R) (1)读取多条数据 ...

  4. Django模型和数据库操作

    文本参考菜鸟教程,创建模型和数据库,并对mysql数据库进行操作. 1.创建数据库 在mysql命令行,输入创建数据库语句. create database runoob default charse ...

  5. java数据库编程(二) 数据库操作

    关于数据库的连接方法已在java 数据库编程(一)JDBC连接Sql Server数据库一文中为大家介绍,还没有链接数据库的小伙伴请先点击查看. 今天首先为大家介绍一下数据库的连接及操作的核心类与接口 ...

  6. Django学习笔记 ORM操作 From菜鸟教程

    # -*- coding: utf-8 -*- #获取数据的多种操作from django.http import HttpResponsefrom TestModel.models import T ...

  7. django学习笔记--数据库中的多表操作

    1.Django数据库----多表的新增操作 1.一对一模式下新增 创建一个详情对象,把这个对象赋值给创建的新的user对象 author_detail = models.AuthorDetail.o ...

  8. SpringBoot 学习二:操作数据库

    2019独角兽企业重金招聘Python工程师标准>>> 本文将从以下几个方面介绍: 前言 配置数据源 SpringBoot 整合 Mybatis SpringBoot 整合 Jdbc ...

  9. Django学习之数据库与ORM

    二.ORM表模型 表(模型)的创建: 1.ORM之增(create.save) 一对多(ForeignKey): 多对多(ManyToManyField()): 2.ORM之删(delete) 3.O ...

  10. Django框架——模型(数据库操作)

    -- models.py -- ORM(object-relation mapping) 实现数据模型与数据库的解耦: # 对象,关系,映射: 1.根 据对象的类型生成表结构: 2.将对象.列表的操作 ...

最新文章

  1. linux shell里面nohup的用法
  2. (天国之扉文章抢救) 1/10/2003 总结?总结!
  3. 重磅!GitHub官方App官宣发布了
  4. Moment.js日期处理库的使用
  5. 水题 UVA 1586 - Ancient Cipher化学式分子量计算
  6. python sqlite3事务_python使用上下文管理器实现sqlite3事务机制
  7. DP! | 不要怂!
  8. 再次确认输入值、事件绑定实例、输入框内容获取与显示
  9. java xml二进制流传输_XML中二进制数据的处理方法
  10. DataTable对象的操作问题
  11. 机器学习基础-特征工程简析
  12. 笔记本电脑耳机插入后声音还是外放的解决办法
  13. 南京银行网站连接不到服务器,南京银行网络准入控制平台
  14. 计算机网络之网络层- IPv4编址
  15. Java Web 开发后续(四)
  16. 如何使用Yii2编程:Google身份验证
  17. 2022-07-17 Linux group与user基础概念
  18. 华泰单因子测试之估值类因子(回归法)
  19. SIPP对Freeswitch进行压力测试
  20. 【评分卡】评分卡入门与创建原则——分箱、WOE、IV、分值分配

热门文章

  1. Zksync Era空投要求,快照日期推演
  2. Android11.0系统中实现静默安装并启动App以及静默卸载
  3. 15年来最获好评的150部电影
  4. FMouse是啥子?
  5. 如何用matlab对excel数据,将某一列里重复的数据行分开存储
  6. 记一个aws php sdk上传s3问题 payload content length is required and can not be calculated
  7. 学习记忆——题型篇——写作——记忆宫殿法
  8. 线性代数之七:矩阵的微分
  9. 通过反射模拟springIoc
  10. c mysql查询一个表所有记录,MySQL查询数据之:单表查询