一、ORM框架

ORM ,Object relational mapping 对象关系映射。

把类和数据库表对应,把对象和表记录对应,通过类和对象操作数据库表中的数据,而不需要编写SQL语句。

Django框架实现了ORM 功能:

  • 不需要直接面向数据库编程,通过模型类和对象完成数据表的增删改查操作;
  • 自动生成数据库表;
  • 通过配置切换使用不同的数据库。

ORM 开发步骤:

  1. 配置数据库
  2. 定义模型类 (models.py)
  3. 执行迁移命令,生成数据库表
  4. 通过模型类和对象操作数据库

二、数据库的配置

  • 手动创建 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_addauto_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)数据库的更多相关文章

  1. django 操作数据库--orm(object relation mapping)---models

    思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...

  2. Django 07 Django模型基础2 (常用查询和多表关联)

    Django 07 Django模型基础2 (常用查询和多表关联) 一.常用查询 #查找数据 def search_user(request): #获取 rs = User.objects.first ...

  3. python学习笔记--Django入门三 Django 与数据库的交互:数据建模

    把数据存取逻辑.业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller (MVC)模式.在这个模式中, Model 代表数据存取层,View 代表的是系统中 ...

  4. Django模型-数据库操作

    前言 前边记录的URLconf和Django模板全都是介绍页面展示的东西,也就是表现层的内容.由于Python先天具备简单而强大的数据库查询执行方法,Django 非常适合开发数据库驱动网站. 这篇开 ...

  5. Django: 之数据库导入、迁移和联用

    Django 数据库导入 从网上下载的一些数据,excel表格,xml文件,txt文件等有时候我们想把它导入数据库,应该如何操作呢? 以下操作符合 Django版本为 1.6 ,兼顾 Django 1 ...

  6. Django查询数据库性能优化

    现在有一张记录用户信息的UserInfo数据表,表中记录了10个用户的姓名,呢称,年龄,工作等信息. models文件 from django.db import models class Job(m ...

  7. django模型——数据库(二)

    模型--数据库(二) 实验简介 模型的一些基本操作,save方法用于把对象写入到数据库,objects是模型的管理器,可以使用它的delete.filter.all.order_by和update等函 ...

  8. Linux下安装Python3的django并配置mysql作为django默认数据库(转载)

    我的操作系统为centos6.5 1  首先选择django要使用什么数据库.django1.10默认数据库为sqlite3,本人想使用mysql数据库,但为了测试方便顺便要安装一下sqlite开发包 ...

  9. django查询数据库无法过滤月份的解决

    我试过,当settings里的:USE_TZ = False时也可以查询,但是数据库里的时间就会显示错的 解决方法是可以再终端输入 mysql_tzinfo_to_sql /usr/share/zon ...

  10. django中数据库的配置及相关增删改查

    ORM ORM是什么?:(在django中,根据代码中的类自动生成数据库的表也叫--code first) ORM:Object Relational Mapping(关系对象映射) 类名对应---- ...

随机推荐

  1. 《图解HTTP》笔记2

    1.SSL(Secure Socket Layer,安全套接层) 1)SSL的作用 通信加密 确定通信方 SSL 提供认证和加密处理及摘要功能 HTTP 协议中没有加密机制,但可以通过和 SSL(Se ...

  2. vue1 微博demo

  3. Web UI开发神器—Kendo UI for jQuery数据管理网格编辑操作

    Kendo UI for jQuery最新试用版下载 Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support f ...

  4. Python中的基本类型简介

    1.变量 变量不仅可以是数字,还可以是任意数据类型 命名规范:变量是用一个变量名表示,变量名必须是大小写英文.数字和下划线_的组合,且不能用数字开头 python中等号“=”是赋值语句,可以把任意数据 ...

  5. 关于webpack require.context() 的那点事

    先说 webpack里面有这么一招:使用require.context()方法来自动导入模块 官方文档有点深奥,老衲百度下拿了一段来直接使用,但是想看下它是如何运行的 本篇这里不会有太深入的研究,只是 ...

  6. mysql查看当前所有数据库中的表大小和元信息information_schema

    查看所有mysql数据库表和索引大小 mysql查看当前所有的数据库和索引大小 ,),' mb') as data_size, concat(,),'mb') as index_size from i ...

  7. BZOJ 2281: [Sdoi2011]黑白棋 (Nim游戏+dp计数)

    题意 这题目有一点问题,应该是在n个格子里有k个棋子,k是偶数.从左到右一白一黑间隔出现.有两个人不妨叫做小白和小黑.两个人轮流操作,每个人可以选 1~d 枚自己颜色的棋子,如果是白色则只能向右移动, ...

  8. vs 2017 无法安装任何 nuget package,提示“库没有注册。。。”

    vs 2017 无法安装任何 nuget package,提示“库没有注册(异常来自 HRESULT: 0x8002801D (TYPE_E_LIBNOTREGISTERED))” 各种百度谷歌都没有 ...

  9. 数据库读写分离、分表分库——用Mycat

    转:     https://www.cnblogs.com/joylee/p/7513038.html 系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据 ...

  10. js中对象的输出顺序

    前言:最近用for-in时,看到说for-in不能保证遍历的对象顺序,对此有些疑问,于是便研究了下,本文做简要说明. 现象 let obj = { a: 'a', b: 'b', 1: 1, 2: 2 ...