Django:(07)数据库
一、ORM框架
ORM ,Object relational mapping 对象关系映射。
把类和数据库表对应,把对象和表记录对应,通过类和对象操作数据库表中的数据,而不需要编写SQL语句。
Django框架实现了ORM 功能:
- 不需要直接面向数据库编程,通过模型类和对象完成数据表的增删改查操作;
- 自动生成数据库表;
- 通过配置切换使用不同的数据库。
ORM 开发步骤:
- 配置数据库
- 定义模型类 (
models.py) - 执行迁移命令,生成数据库表
- 通过模型类和对象操作数据库
二、数据库的配置
- 手动创建 MySQL 数据库:
create database 数据库名 charset=utf8;
- 在与项目 setting.py 文件中配置使用mysql;
- 在python虚拟环境下安装 MySQL 驱动
pip install pymysql
- 在 与项目同名的包 下的 __init__.py 文件中,初始化MySQL驱动
pymysql.install_as_MySQLdb()
四、迁移命令的使用
- 打开终端,进入到项目manage.py所在目录下
- 生成迁移文件
python manage.py makemigrations
- 生成数据库表
python manage.py migrate
三、定义模型类
(1)定义属性
- 模型类属性与表字段一 一对应
- 定义属性时,需要指定字段类型,通过字段类型的参数指定选项,格式如下:
属性名 = models.字段类型(字段选项)
- 属性名不能是python的保留关键字
- 属性名不能使用连续的下划线(这是由django的查询方式决定的)
(2)主键
主键:primary key,简写 pk
不需要主动定义,django会自动生成自增长的主键,属性名叫 id,
如果开发者自己定义了主键,则django不会再生成默认的主键
(3)表名
应用名小写_模型类名小写
(4)字段类型
| 类型 | 说明 |
|---|---|
| AutoField | 自动增长的IntegerField,通常不用指定,不指定时Django会自动创建名为id的自动增长属性 |
| BooleanField | 布尔字段,值为True或False |
| NullBooleanField | 支持Null、True、False三种值 |
| CharField | 字符串,必须指定:max_length,表示最大字符个数 |
| TextField | 大文本字段,一般超过4000个字符时使用 |
| IntegerField | 整数 |
| DecimalField | 十进制浮点数,用python中的Decimal实例来表示 必须指定: max_digits总位数,decimal_places小数位数。 |
| FloatField | 浮点数 |
| DateField | 日期 1) 参数 auto_now表示每次修改保存对象时,自动设置该字段为当前时间,用于保存"最后一次修改"时间,默认为False; 2) 参数 auto_now_add表示当对象第一次被创建时自动设置保存当前时间,用于保存"创建时间"时间,默认为值为False; 3) 参数 auto_now_add和auto_now是相互排斥的,不能同时用到一个属性中 |
| TimeField | 时间,参数同DateField |
| DateTimeField | 日期时间,参数同DateField |
| FileField | 上传文件字段 |
| ImageField | 继承于FileField,对上传的内容进行校验,确保是有效的图片 |
(5)字段选项
| 选项 | 默认值 | 描述 | 是否要迁移修改表结构 |
|---|---|---|---|
| null | False | True表示表字段允许为空 | 是 |
| unique | False | True表示表字段不能重复 | 是 |
| db_column | 属性名称 | 表字段名称 | 是 |
| primary_key | False | True表示字段设置为了主键,一般作为AutoField的选项使用 | 是 |
| default | - | 默认值 | 否 |
| blank | False | 在django管理后台新增或编辑一条表数据时,该字段是否允许为空; null是数据库范畴的概念,blank是表单验证范畴的 |
否 |
| choices | - | 在django管理后台新增或编辑一条表数据时,该字段显示为下拉框,默认为编辑框 | 否 |
(6)外键
关系型数据库的关系包括三种类型
ForeignKey: 一对多,将关联属性定义在多的一端中ManyToManyField: 多对多,将关联属性定义任意一方中OneToOneField: 一对一,将关联属性定义在任意一方中
(7)定义一个模型类
1、需求:
保存部门-员工数据
部门类(Department)
- 部门名称: name
- 部门成立时间: create_date
- 逻辑删除标识:is_delete
员工类(Employee)
- 姓名: name
- 年龄: age
- 性别: sex
- 工资: salary
- 入职时间: hire_date
- 备注信息: comment
2、代码:
class Department(models.Model):
"""部门类""" # 部门名称:字符串类型(必须要指定最大长度)
name = models.CharField(max_length=)
# 部门成立时间: 日期类型
create_date = models.DateField(auto_now_add=True)
# 逻辑删除标识:标识部门是否删除
is_delete = models.BooleanField(default=False) def __str__(self):
return self.name class Meta:
# 指定表名
db_table = 'department' class Employee(models.Model):
"""员工类""" choices_gender = (
(, '男'),
(, '女'),
) name = models.CharField(max_length=)
age = models.IntegerField()
gender = models.IntegerField(default=, choices=choices_gender)
# 工资:浮点类型(必须要指定两个选项)
salary = models.DecimalField(max_digits=, decimal_places=)
# 备注信息: 可以为空
comment = models.CharField(max_length=, null=True, blank=True)
# 员工入职时间
hire_date = models.DateField(auto_now_add=True)
# 一对多的外键:员工所属部门 department_id
department = models.ForeignKey('Department') def __str__(self):
return self.name class Meta:
# 指定表名
db_table = 'employee'
四、执行迁移命令,生成数据库表
- 打开终端,进入到项目manage.py所在目录下
- 生成迁移文件
python manage.py makemigrations
- 生成数据库表
python manage.py migrate
- 默认数据库为
sqlite3,数据库名为:db.sqlite3,可在配置中设置为自定义。
五、通过模型类和对象操作数据库
(1)模型类管理器Manager的作用
每个模型类默认都有一个叫 objects 的类属性,它由django自动生成
我们把 objects 称为 模型管理器,其类型为: django.db.models.manager.Manager
通过objects属性,可以实现对数据库相关的操作
| objects管理器中的方法 | 返回类型 | 作用 |
|---|---|---|
| 模型类.objects.create() | 模型类对象 | 创建一个对象(新增一条数据) |
| 模型类.objects.get() | 模型对象 | 查询一个对象,且只能有一个: 如果查到多条数据,则报:MultipleObjectsReturned 如果查询不到数据,则报:DoesNotExist |
| 模型类.objects.all() | QuerySet | 查询所有的对象 |
| 模型类.objects.count() | 数字 | 查询总共有多少条数据 |
| 模型类.objects.filter() | QuerySet | 查询满足条件的对象 |
| 模型类.objects.exclude() | QuerySet | 查询不满条件的对象 |
| 模型类.objects.order_by() | QuerySet | 对查询结果集进行排序 |
| 模型类.objects.aggregate() | 字典,例如: {'salary__avg': 9500.0} |
进行聚合操作 Sum, Count, Max, Min, Avg |
(2)查询集QuerySet的特点
1、基本使用
当调用模型管理器的 all, filter, exclude, order_by等方法时,返回的是一个 QuerySet 对象,表示从数据库查询到的数据集合;
| objects管理器中的方法 | 返回类型 | 作用 |
|---|---|---|
| 模型类.objects.all() | QuerySet | 查询所有的对象 |
| 模型类.objects.filter() | QuerySet | 查询满足条件的对象 |
| 模型类.objects.exclude() | QuerySet | 查询不满条件的对象 |
| 模型类.objects.order_by() | QuerySet | 对查询结果集进行排序 |
QuerySet 提供的方法(支持链式写法)
QuerySet方法 |
返回类型 | 作用 |
|---|---|---|
| get() | 模型对象 | 查询一个对象,且只能有一个: 如果查到多条数据,则报: MultipleObjectsReturned 如果查询不到数据,则报: DoesNotExist |
| all() | QuerySet | 查询所有的对象 |
| count() | 数字 | 查询总共有多少条数据 |
| filter() | QuerySet | 查询满足条件的对象 |
| exclude() | QuerySet | 查询不满条件的对象 |
| order_by() | QuerySet | 对查询结果集进行排序 |
| aggregate() | 字典,例如: {'salary__avg': 9500.0} |
进行聚合操作 Sum, Count, Max, Min, Avg |
| exists() | 布尔型 | True表示有查询集中有数据,否则没有 |
支持 下标 和 切片 操作
query_set[0]:取出查询集中的第一条数据,不存在会抛IndexError异常
query_set[0:2]:切片操作得到另一个新的QuerySet
注意:下标不能为负数
2、查询集的两大特性
惰性查询:
创建查询集时不会访问数据库,操作查询集中的数据时才会访问;
操作查询集指 下标、切片、迭代操作,与if合用 等
缓存功能:
当遍历(迭代)访问查询集 所有数据,会缓存查询集所有数据,当再次操作该查询集中的数据时,将会使用缓存;
如果只是访问查询集 部分数据(下标或切片)不会缓存
(3)用ORM进行数据库的增删改查
增
模型类对象.save()
模型类.objects.create(属性1=值1,属性2=值2, ...)
删
模型类对象.delete()
模型类.filter(条件).delete()
改
模型类对象.save()
模型类.filter(条件).update(属性1=值1,属性2=值2, ...)
查
条件查询
调用 filter方法: 模型类.objects.filter(模型类属性名__条件名=值)
返回包含查询结果数据的 QuerySet 对象
F对象
F对象:比较表中的两个字段,接收的参数为一个字符串
用法: F('属性名')
比如:成绩表.objects.filter(语文__gt=F('数学'))
需要导包: from django.db.models import F
Q对象
作用: 对查询条件进行 与 或 非 (& | ~) 的逻辑操作
用法: 先导入 from django.db.models import Q
与: Q(查询条件1) & Q(查询条件2)
或: Q(查询条件1) | Q(查询条件2)
非: ~Q(查询条件)
聚合
作用: 聚合操作,对多行查询结果中的一列进行操作,返回一个值
用法: 模型类.objects.aggregate(聚合类('属性名'))
常用聚合类有:Sum, Count, Max, Min, Avg等
返回值是一个字典, 格式: {'属性名__聚合函数': 值}
使用时需要先导入聚合类: from django.db.models import Sum, Count, Max, Min, Avg
排序
作用: 对查询结果进行排序,默认为升序
用法:
升序: 模型类.objects.order_by('属性名')
降序: 模型类.objects.order_by('-属性名')
关联查询
通过 对象 进行关联查询
由 一类对象 查询 多类对象: 一类对象.多类名小写_set.all()
由 多类对象 查询 一类对象: 多类对象.关联属性
通过模型类实现上述两个案例
一类名.objects.filter(多类名小写__多类属性名__条件名=值)
多类名.objects.filter(关联属性__一类属性名__条件名=值)
推荐阅读:《Django模型》http://www.runoob.com/django/django-model.html
Django:(07)数据库的更多相关文章
- django 操作数据库--orm(object relation mapping)---models
思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...
- Django 07 Django模型基础2 (常用查询和多表关联)
Django 07 Django模型基础2 (常用查询和多表关联) 一.常用查询 #查找数据 def search_user(request): #获取 rs = User.objects.first ...
- python学习笔记--Django入门三 Django 与数据库的交互:数据建模
把数据存取逻辑.业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller (MVC)模式.在这个模式中, Model 代表数据存取层,View 代表的是系统中 ...
- Django模型-数据库操作
前言 前边记录的URLconf和Django模板全都是介绍页面展示的东西,也就是表现层的内容.由于Python先天具备简单而强大的数据库查询执行方法,Django 非常适合开发数据库驱动网站. 这篇开 ...
- Django: 之数据库导入、迁移和联用
Django 数据库导入 从网上下载的一些数据,excel表格,xml文件,txt文件等有时候我们想把它导入数据库,应该如何操作呢? 以下操作符合 Django版本为 1.6 ,兼顾 Django 1 ...
- Django查询数据库性能优化
现在有一张记录用户信息的UserInfo数据表,表中记录了10个用户的姓名,呢称,年龄,工作等信息. models文件 from django.db import models class Job(m ...
- django模型——数据库(二)
模型--数据库(二) 实验简介 模型的一些基本操作,save方法用于把对象写入到数据库,objects是模型的管理器,可以使用它的delete.filter.all.order_by和update等函 ...
- Linux下安装Python3的django并配置mysql作为django默认数据库(转载)
我的操作系统为centos6.5 1 首先选择django要使用什么数据库.django1.10默认数据库为sqlite3,本人想使用mysql数据库,但为了测试方便顺便要安装一下sqlite开发包 ...
- django查询数据库无法过滤月份的解决
我试过,当settings里的:USE_TZ = False时也可以查询,但是数据库里的时间就会显示错的 解决方法是可以再终端输入 mysql_tzinfo_to_sql /usr/share/zon ...
- django中数据库的配置及相关增删改查
ORM ORM是什么?:(在django中,根据代码中的类自动生成数据库的表也叫--code first) ORM:Object Relational Mapping(关系对象映射) 类名对应---- ...
随机推荐
- redis安装,以及开机自动启动
tcl安装 # wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz# tar -xzvf tcl8.6.1-src.tar.gz ...
- 24-SQLServer存储空间的分配和使用情况
一.总结 1.SQLServer中的数据库有的时候会有多个数据文件组或者多个数据文件的情况,该博客就是讨论当有多个数据文件时,表的数据会怎么存储,存储在哪些数据文件中. 2.首先SQLServer中的 ...
- django -过滤器的使用
前情提要: 最近工作中用到django 中的 自定制过滤器的内容, 再此 复习一波过滤器和自定制 过滤器的内容 自定制过滤器 1.在settings中的INSTALLED_APPS配置当前app ...
- Vue项目中的文件/文件夹命名规范
Vue项目中的文件/文件夹命名规范 0.2262018.09.21 16:01:09字数 820阅读 6979 文件或文件夹的命名遵循以下原则: index.js 或者 index.vue,统一使用小 ...
- git error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
原因:git 版本过低 解决方法:卸载旧版本,重装新版本
- 解决InputStream中数据读取不完整问题
转载:https://blog.csdn.net/lilidejing/article/details/37913627 当需要用到InputStream获取数据时,这时就需要读取InputStrea ...
- word黏贴图片显示不出来
word图片转存,是指UEditor为了解决用户从word中复制了一篇图文混排的文章粘贴到编辑器之后,word文章中的图片数据无法显示在编辑器中,也无法提交到服务器上的问题而开发的一个操作简便的图片转 ...
- 使用scikit-learn决策树实现简单预测
1.scikit-learn决策树算法库介绍 scikit-learn决策树算法类库内部实现是使用了调优过的CART树算法,既可以做分类,又可以做回归.分类决策树的类对应的是DecisionTreeC ...
- The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest B、H
比赛链接https://www.jisuanke.com/contest/3098?view=challenges B题 拉格朗日插值 题意 T组输入.一个n次多项式 f(x) ,每项的系数不知道, ...
- 在Android中使用OpenGL ES开发第(五)节:GLSL基础语法
一.前期基础储备笔者之前的四篇文综述了Android中使用OpenGL ES绘制基本图形和实现了简单的相机预览,初次接触OpenGL ES开发的读者可能对其中新的概念比较迷惑,尤其是其中的顶点着色器( ...