数据库基本操作(查询)
一、查询对象
从数据库里检索对象,可以通过模型的Manage来建立QuerySet,一个QuerySet表现为一个数据库中对象的结合,他可以有0个一个或多个过滤条件,在SQL里QuerySet相当于select语句用where或limit过滤。你通过模型的Manage来获取QuerySet,每个模型至少有一个Manage
注:
Managers
只可以通过模型的类访问,而不可以通过模型的实例访问,目的是为了强制区分“表级别”的操作和“记录级别”的操作
二、返回QuerySet对象
要检索数据库中的对象,就要为你的model 类构造一个查询集QuerySet。一个QuerySet就代表数据库中的一组数据。它可以有一个或很多个,也可以通过filter根据给定的参数对数据集做进一步筛选。在SQL术语中,QuerySet相当于SELECT语句,filter相当于WHERE或LIMIT这样的限定从句
为什么要使用QuerySet对象,主要是他包含两个比较重要的特性
- 惰性机制
- 缓存机制
query_set缓存机制1次数据库查询结果query_set都会对应一块缓存,再次使用该query_set时,不会发生新的SQL操作;这样减小了频繁操作数据库给数据库带来的压力
1、all
-
方法
all()[]
-
说明
查询所有信息 支持切片操作,切片只支持正整数,索引从0开始
-
示例代码
# 不触发数据库操作 users = UserInfo.objects.all() for user in users: # 触发数据库操作 print(user.username) # 切片操作 触发数据库操作 # 获取第11条数据 users = UserInfo.objects.all()[10] # 获取前5条数据 users = UserInfo.objects.all()[0:5] # 获取第1条到第10条数据 users = UserInfo.objects.all()[1:10] users = UserInfo.objects.all()[0:10:2]
2、filter
-
方法
filter(**kwargs)
-
说明
返回一个QuerySet,包含满足查询参数的对象
-
参数
-
**kwargs
查询的参数,where后面的条件
-
-
示例代码
UserInfo.objects.filter(username='小明')
3、exclude()
-
方法
exclude(**kwargs)
-
说明
反向查询,指返回查询条件相反的对象
-
参数
-
**kwargs
查询的参数,where后面的条件
-
-
示例代码
UserInfo.objects.exclude(username='小明')
4、order_by()
-
方法
order_by(**kwargs)
-
说明
对结果集进行升序或降序,可指定需要排序的字段。
-
参数f
-
**kwargs
查询的参数,order by后面的字段
-
-
示例代码
# 升序 UserInfo.objects.filter().order_by('create_date') # 降序 UserInfo.objects.filter().order_by('-create_date') # 随机排序(开发中不要使用) UserInfo.objects.order_by('?create_date')
5、values()
-
方法
values(**kwargs,**expressions)
-
说明
- 当作为迭代器使用时,返回一个返回字典,而不是模型实例。
- 该values()方法采用可选的位置参数,*fields它指定SELECT应限制的字段名称。如果指定了字段,每个字典将仅包含指定字段的字段键/值。如果不指定字段,则每个字典将包含数据库表中每个字段的键和值
- 该values()方法还包含可选的关键字参数 **expressions
-
参数
-
**kwargs
过滤的列
-
**expressions
关键字参数 例如常见的:Lower(值转化成小写), Upper(值转化成大写), Length(计算值的长度)
-
-
示例代码
UserInfo.objects.all().values() #指定字典 UserInfo.objects.all().values('username') # 可选关键字 from django.db.models.functions import Lower, Upper, Length objects.values(lower=Lower('username')) objects.values(lower=Upper('username')) objects.values(lower=length('username'))
6、values_list()
-
方法
values_list(*fields,flat=False)
-
说明
返回列表,每个元组都包含传入values_list()调用的相应字段或表达式的值,
-
参数
-
*fields
过滤在的字段
-
flat
bool类型,默认是False,
如果只传入单个字段,则还可以传入 flat 参数设置为True,这将意味着返回的结果是单值,而不是一元组。
-
-
示例代码
# 查询所有字段的值 users = UserInfo.objects.all().values_list() # 查询单值字段的值 users = UserInfo.objects.values_list('username', flat=True) # 查询指定字段的值 users = UserInfo.objects.values_list('uid', 'username') # 如果想查询单条记录可以 users = UserInfo.objects.values_list('uid', 'username').first() # 或者 users = UserInfo.objects.values_list('uid', 'username').get(pk=1)
7、raw()
-
方法
raw(str)
-
说明
在模型查询API不够用的情况下,你可以使用原始的SQL语句。Django提供两种方法使用原始SQL进行查询:一种是使用Manager.raw()方法,进行原始查询并返回模型实例;另一种是完全避开模型层,直接执行自定义的SQL语句。
raw()接受一个原始的SQL查询,执行它并返回一个 django.db.models.query.RawQuerySet实例。这个RawQuerySet实例可以像正常一样迭代QuerySet以提供对象实例。
-
参数说明
-
str
原生sql语句
-
-
示例代码
raw = UserInfo.objects.raw( 'select * from UserInfo where username = '%s' ORDER BY id desc' % name) #通过raw方法查询的结果是一个RawQuerySet对象,如果想取到所有的值 raw[0].__dict__ #可以封装成方法 def Serialization(objects) : ''' _obj: objext -> list, Python 3.6新加入的特性, 用来标识这个方法接收一个对象并返回一个list orm.raw序列化 ''' _list = [] _get = [] for i in objects: _list.append(i.__dict__) for i in _list: del i['_state'] _get.append(i) return _get
8、链式查询
-
说明
类似jQuery的链式编程
-
示例代码
users = UserInfo.objects.filter(username='test2').exclude(is_delete=True).filter(create_date=date(2018, 7, 5)) # 等同 # qt = UserInfo.objects.filter(username='test2') # qt = qt.exclude(is_delete=True) # qt = qt.filter(create_date=date(2018, 7, 5))
11、Q()
-
说明
Q对象(django.db.models.Q)可以对关键字参数进行封装,从而更好地应用多个查询。可以组合使用 &(and),|(or),~(not)操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象
每个接受关键字参数的查询函数(例如
filter()
、exclude()
、get()
)都可以传递一个或多个Q
对象作为位置(不带名的)参数。如果一个查询函数有多个Q
对象参数,这些参数的逻辑关系为“AND"注意:一定要把Q对象放在关键字参数查询的前面
-
示例代码
# 查询 注册日期是2016-10-2 或者 2016-10-6日的所有用户信息 users= UserInfo.objects.filter( Q(create_time=date(2016, 10, 2)) | Q(create_time=date(2016, 10, 6)) ) # 查询 用户名是xiaohong 和 没有注销的用户信息 users= UserInfo.objects.filter( Q(username='xiaohong') & Q(is_delete=False) )
12、F()
-
说明
允许Django在未实际链接数据的情况下具有对数据库字段的值的引用。通常情况下我们在更新数据时需要先从数据库里将原数据取出后方在内存里,然后编辑某些属性,最后提交。F对象支持四则运算
-
示例代码
# from django.db.models import F UserInfo.objects.update(num=F('num')+1)
三、不返回QuerySet对象
QuerySet方法结果集不返回QuerySet。这些方法不使用缓存。相反,他们每次查询都会调用数据库。
1、get()
-
方法
get(**kwargs)
-
说明
返回匹配给定查找参数的对象,该参数应采用字段查找中描述的格式
如果没有找到给定参数的对象,则引发DoesNotExist异常。
如果没有找多个给定参数的对象,则引发MultipleObjectsReturned异常。
-
参数说明
**kwargs: 查询的参数
-
返回值
模型对象
-
示例代码
user = UserInfo.objects.get(uid=1) UserInfo.objects.get(id=1, username='xiaoming')
3、count()
-
方法
count()
-
说明
返回总条数
-
参数说明
无
-
返回值
整形
-
示例代码
UserInfo.objects.count() UserInfo.objects.filter(uid gt =1).count()
4、last()
-
说明
获取最后最后一条数据
5、first()
-
说明
获取第一条数据
6、annotate()
-
方法
annotate(*args,**kwargs)
-
说明
分组函数,用于实现聚合group by查询 前面的values写的是谁,就group谁
参数说明
-
返回值
通过计算得到的聚合值的字典
-
示例代码
from django.db.models import Avg, Min, Max, Count, Sum # 按性别统计用户的总数 # SELECT `sex`, COUNT('count') AS `uid` FROM `user` GROUP BY `sex`, users = UserInfo.objects.values('sex').annotate(uid=Count('uid')) # SELECT `user`.`sex`, COUNT(`user`.`uid`) AS `uid`, AVG(`user`.`age`) AS `ages` FROM `user` GROUP BY `user`.`sex`, users = UserInfo.objects.values('sex').annotate(uid=Count('uid'), ages=Avg('age'))
7、aggregate()
-
方法
aggregate(*args, **kwargs)
-
说明
聚合函数
-
参数说明
- Avg,
- Min,
- Max,
- Count,
- Sum
-
返回值
通过计算得到的聚合值的字典
-
示例代码
from django.db.models import Avg, Min, Max, Count, Sum users = UserInfo.objects.aggregate(uid=Count('uid'))