一、ORM查询数据库
1.1 filter()过滤器 -- 精确查询
作用: 返回符合条件的数据
对象.objects.filter(筛选条件): 查询满足条件的查询集
1.2 获取所有数据
对象.objects.all() : 返回数据库中所有数据集
1.3 获取满足条件的数据
对象.objects.get(筛选条件):
注意:获取满足条件的对象,但是查询条件必须存在,并且查询数据条数为1条,否则都会报错
而filter()当查询条件不存在时返回空查询集,数据条数大于1时,返回一个列表类型的查询集
对象.objects.exclude(过滤条件)
返回不满足条件的结果集(QuerySet),也可以说是过滤掉满足条件的结果集
1.4 组合条件查询
如:
# 查询年龄等于18且性别为女的学生信息
stus = Student.objects.filter(age=18).filter(gender=0)
# 多个条件可以写在一个filter中(推荐使用)
stus = Student.objects.filter(age=18, gender=0)
二、 从查询集中获取数据
2.1 下标获取
stus = Student.objects.all()
如: stus[0]
但是注意下标越界异常
2.2 first() 获取第一个元素
如: stus.first()
2.3 last() 获取最后一个元素
如: stus.last()
三、 排序 order_by
对象.objects.order_by(排序字段)
如:
stus = Student.objects.all().order_by('-id')
# 排序 order_by
# 降序 -id 在sql中 id desc
# 升序 id 在sql中 id asc
测试可以通过values()获取对象键值对
如:stus.values()
限制查询集,可以使用下标的方法进行限制,等同于sql中的limit
模型名.objects.all()[0:5] 小标不能为负数
函数 | 说明 |
---|---|
first() | 返回查询集中的第一个对象 |
last() | 返回查询集中的最后一个对象 |
count() | 返回当前查询集中的对象个数 |
exists() | 判断查询集中是否有数据,如果有数据返回True,没有返回False |
四、 模糊查询
4.1 contains 包含 类似于 like %小%
如:
stus = Student.objects.filter(name__contains='小')
4.2 endswith 以什么结束 类似于 like %小
如:
stus = Student.objects.filter(name_endswith='明')
4.3 startswith 以什么开头 类似于 like 大%
如:
stus = Student.objects.filter(name__startswith='大')
注意:以上模糊查询中都对大小写敏感,可以在前面加 i(ignore)忽略大小写(icontains、istartwith、iendswith)
4.4 集合运算 -- in
如:
stus = Student.objects.filter(id__in=[2, 3, 5, 14])
stus = Student.objects.filter(pk__in=[2, 3, 5, 14])
4.5 比较运算
gt(大于)、gte(大于等于)、lt(小于)、lte(小于等于)
如:
stus = Student.objects.filter(age__gt=18)
4.5 聚合 aggreagate()
sql中有的聚合函数这里都有(Sum Avg Max Min Count)
-
需要导入相应的包
from django.db.models import Sum, Avg, Max, Min, Count
如:
avg_age = Student.objects.all().aggregate(Avg('age'))
sum_age = Student.objects.all().aggregate(Sum('age'))
4.6 逻辑运算(且(&)、 或(|)、 非(~))
逻辑运算需要借助F对象和Q对象,所以需要先导入相应的包
from django.db.models import F, Q
如:
# 查询age=18或者gender=0的学生信息
# Q(条件)
stus = Student.objects.filter(Q(age=18), Q(gender=0)) # 相当于与(&)
stus = Student.objects.filter(Q(age=18) & Q(gender=0))
stus = Student.objects.filter(Q(age=18) | Q(gender=0))
stus = Student.objects.filter(~Q(age=18) & Q(gender=1))
# F() 对象
# 查询语文成绩比数学成绩大的学生信息
stus = Student.objects.filter(yuwen__gt=F('shuxue'))
# 查询语文成绩比数学成绩大10分的学生信息
stus = Student.objects.filter(yuwen__gt=F('shuxue') + 10)
# F对象支持数学运算
<center>小结</center>
条件 | 说明 |
---|---|
exact / iexact | 精确匹配/忽略大小写的精确匹配查询 |
contains / icontains / startswith / istartswith / endswith / iendswith | 基于like的模糊查询 |
in | 集合运算 |
gt / gte / lt / lte | 大于/大于等于/小于/小于等于关系运算 |
range | 指定范围查询(SQL中的between…and…) |
year / month / day / week_day / hour / minute / second | 查询时间日期 |
isnull | 查询空值(True)或非空值(False) |
search | 基于全文索引的全文检索 |
regex / iregex | 基于正则表达式的模糊匹配查询 |
六、一对一(OneToOneField)的关联查询
6.1 概述: 在python中一对一的关系主要通过OneToOneField来实现,与sql中的外键关联差不多,但是在一对一的关系中外键可以添加在需要关联的任意一个模型中(一对多关系中外键一般加在多的一边)
例如:
# 学生类
class Student(models.Model):
name = models.CharField(max_length=20)
age = models.IntegerField(default=18)
class Meta:
# 设置表明
db_table = 'tb_student'
# 学生信息扩展类
class StuInfo(models.Model):
phone = models.CharField(max_length=11)
address = models.CharField(max_length=31)
# 添加外键
stu = models.OneToOneField(Student)
class Meta:
db_table = 'tb_stuinfo'
注意:OneToOneField等价ForeignKey,且约束unique=True,并且外键映射到数据库中时会键外键字段名默认为 ---- 字段_id
如上面定义的stu外键在数据库中为: stu_id
6.2 正向关联查询
子表查询主表为 --- 正向查询
主表查询子表为 --- 反向查询
如:
# 正向查询
# 查询电话为10011的学生姓名(子表查主表)
stu_info = StuInfo.objects.filter(phone='10011').first()
stu = stu_info.stu
name = stu.name
6.2 反向关联查询
如:
# 反向查询
# 查询名字为小明的学生电话name='小明'
stu = Student.objects.filter(name='小明').first()
stu_info = stu.stuinfo
phone = stu_info.phone