Django框架之(之七-九)数据库查询和ORM
一、查询操作
- 查找是数据库操作中一个非常重要的技术。查询一般就是使用filter、exclude以及get三个方法来实现。
- 查询条件
代码 | 意义 |
---|---|
exact | 使用精确的=进行查找 |
iexact | 使用like进行查找 |
contains | 大小写敏感,判断某个字段是否包含了某个数据 |
icontains | 大小写不敏感的匹配查询 |
in | 提取那些给定的field的值是否在给定的容器中 |
二、根据关联的表进行查询
categories = Category.object.filter(article__title__contains="xxxxx")
三、比较运算
代码 | 意义 |
---|---|
gt | 某个field的值要大于给定的值 |
gte | 类似于gt,是大于等于 |
lt | 类似于gt是小于 |
lte | 类似于lt,是小于等于 |
range | 判断某个field的值是否在给定的区间中 |
date | 针对某些date或者datetime类型的字段 |
year | 根据年份进行查找 |
time | 根据时间进行查找 |
四、聚合函数
4.1聚合函数的使用
代码 | 意义 |
---|---|
Avg | 求平均值 |
Count | 获取指定的对象的个数 |
Max和Min | 获取指定对象的最大值和最小值 |
Sum | 求指定对象的总和 |
- avg
- count
- min和max
- sum
4.2aggregate和annotate的区别
- aggregate:返回使用聚合函数后的字段和值。
- annotate:在原来模型字段的基础之上添加一个使用了聚合函数的字段,并且在使用聚合函数的时候,会使用当前这个模型的主键进行分组(group by)
4.3F表达式和Q表达式
- F表达式
F表达式是用来优化ORM操作数据库的。 - F表达式的应用场景
1.避免竞争条件。当两个线程同时进行操作,在第一个线程正在操作还未保存的时候,第二个进程进行取值,修改保存。则第一个操作的值被覆盖丢失。但是由数据库操作的时候则不会出现此种情况。
2.用于Queryset中的过滤。F()的实例作为查询中的模型字段的引用。可以用于两个不同字段比较
3.支持加减乘除模幂操作,支持位操作。
- Q表达式
五、QuerySet的方法
5.1QuerySet API
5.2QuerySet的方法
方法 | 意义 |
---|---|
filter | 将满足条件的数据提取出来,返回一个新的QuerySet |
exclude | 排除满足条件的数据,返回一个新的QuerySet |
annotate | 给QuerySet中的每个对象都添加一个使用查询表达式(聚合函数、F表达式、Q表达式、Func表达式等)的新字段 |
order_by | 指定将查询的结果根据某个字段进行排序 |
values | 用来指定在提取数据出来,需要提取哪些字段 |
values_list | 类似于values |
all | 获取这个ORM模型的QuerySet对象 |
select_related | 在提取某个模型的数据的同时,也提前将相关联的数据提取出来 |
prefetch_related | 访问多个表中的数据的时候,减少查询的次数 |
create | 创建一条数据,并且保存到数据库中 |
get_or_create | 根据某个条件进行查找,如果找到了那么就返回这条数据,如果没有查找到,那么就创建一个 |
exists | 判断某个条件的数据是否存在 |
update | 执行更新操作,在SQL底层走的也是update命令 |
切片操作 | 有时候我们查找数据,有可能只需要其中的一部分 |
六、ORM模型迁移
6.1 迁移命令
1.makemigrations:将模型生成迁移脚本。模型所在的app,必须放在settings.py中的INSTALLED_APPS中。
- app_label:后面可以跟一个或者多个app,那么就只会针对这几个app生成迁移脚本。
- --name:给这个迁移脚本指定一个名字。
- --empty:生成一个空的迁移脚本。
2.migrate:将新生成的迁移脚本,映射到数据库中,创建新的表或者修改表的结构。
- app_label:将某个app下的迁移脚本映射到数据库中。
- app_label migrationname:将某个app下指定名字的migration文件映射到数据库中。
- --fake:可以将指定的迁移脚本名字添加到数据库中。
- --fake-initial:将第一次生成的迁移文件版本号记录在数据库中。
3.showmigrations查看某个app下的迁移文件
python manage.py showmigrations [app名字]
4.sqlmigrate:查看某个迁移文件在映射到数据库中的时候,转换的SQL语句
python manage.py sqlmigrate book 0001_initial
6.2根据已有的表自动生成模型
1.Django给我们提供了一个inspectdb的命令,可以非常方便的将已经存在的表,自动的生成模型。想要使用inspectdb自动将表生成模型。首先需要在settings.py中配置好数据库相关信息。不然就找不到数据库。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "migrations_demo",
'HOST': '127.0.0.1',
'PORT': '3306',
'USER': 'root',
'PASSWORD': 'root'
}
}
2.修正模型:新生成的ORM模型有些地方可能不太适合使用。
class Article(models.Model):
title = models.CharField(max_length=100, blank=True, null=True)
content = models.TextField(blank=True, null=True)
author = models.ForeignKey('front.User', models.SET_NULL, blank=True, null=True)
tags = models.ManyToManyField("Tag",db_table='article_tag')
class Meta:
db_table = 'article'
3.执行命令python manage.py makemigrations生成初始化的迁移脚本,方便后面通过ORM来管理表。这时候还需要执行命令python manage.py migrate --fake-initial
4.将Django的核心表映射到数据库中:Django中还有一些核心的表也是需要创建的。不然有些功能是用不了的。