查询
all() --- 返回查询集中的所有数据
格式:模型名.objects.all()
例子:stus=Student.objects.all()
注意:返回的是一个QuerySet对象
filter() --- 返回符合条件的数据
用法:
filter(键=值)
filter(键=值,键=值) --- 类似于sql中的and
filter(键=值),filter(键=值) --- 和第二个功能相同,只是写法不一样
格式:模型名.objects.filter(键=值)
例子:stus = Student.objects.filter(s_age=16)
返回的也是Querset对象
exlcude() -- 过滤符合条件的数据
格式:模型名.objects.exclude(键=值)
例子:stus = Student.objects.exclude(s_age=16)
order_by() --- 排序
用法:
order_by(键) --- 按照指定的键进行升序
order_by(-键) --- 按照指定的键进行降序
格式:格式:模型名.objects.order_by(键)
values() --- 返回所有的数据,一条数据就是一个字典,返回一个列表
格式:格式:模型名.objects.values()
没有参数既是拿到所有的数据,加上参数就是显示指定的参数
stus = Student.objects.all().values()
return HttpResponse(stus)
返回的是Objects
course.stu.all().values()[0]['id']
返回单个数据
get() --- 返回一个满足条件的对象
注意:
如果没有找到符合条件的对象,就引发错误
如果找到多个对象,会引发错误
格式:模型名.objects.get(键=值)
例子:stus = Student.objects.filter(id=1)
first() --- 返回查询集中的第一个对象
例子:stus = Student.objects.order_by('-id').first()
last() --- 返回查询集中的最后一个对象
例子:stus = Student.objects.order_by('-id').last()
限制查询集
作用:查询集返回列表,可以使用下标的方法进行限制,等同于sql的limit语句
例子:studentList = Students.objects.all()[0:5]
注意:下标不能是负数
字段查询
实现了sql中的where语句,作为方法fliter(),exclude(),get()的参数
格式:属性名称__比较运算符=值
例子:stus = Student.objects.filter(s_name__contains='小')
比较运算符
contains -- 判断是否包含
startswith --- 以某个值开头的
endswith --- 以某个字结尾
注意:以上的比较运算符默认大小写敏感,在前面加上i,就代表不区分大小写icontains, istartswith, iendswith
in --- 判断是否包含在范围中
例子:stus = Student.objects.filter(id__in=[1,2])
gt --- 大于
gte --- 大于等于
lt --- 小于
lte --- 小于等于
pk代表主键
聚合函数
使用aggregate()函数返回聚合函数的值
Avg --- 求平均数
例子:from django.db.models import Max
avgAge = Student.objects.aggregate(Avg('s_age'))
avgAge的值为:{'s_age__avg':17}
avgAge = Student.objects.aggregate(Avg(a = 's_age'))
返回的结果是{'a':17}
Count --- 求个数
Max --- 求最大值
Min --- 最小值
Sum --- 求和
F对象
概念:F() ---- 专门取对象中某列值的操作
作用:操作数据表中的某列值,F()允许Django在未实际链接数据的情况下具有对数据库字段的值的引用,不用获取对象放在内存中再对字段进行操作,python做的唯一的事情就是通过Django的F()函数创建了一条SQL语句然后执行
1、引入F函数:from django.db.models import Q
例子:查询数学成绩比语文成绩大10分的学生的信息
stumaxs = Student.objects.filter(math_score__gt=F('language_score') + 10)
Q对象
Q对象(django.db.models.Q)可以对关键字参数进行封装,,从而更好地应用多个查询,可以组合使用 &(and),|(or),~(not)操作符。当一个操作符是用于两个Q的对象,它产生一个新的Q对象。
例子:查询语文成绩大于60,或者年龄小于20的学生信息
stus = Student.objects.filter(Q(language_score__gt=60) |
Q(s_age__lt=20))
例子:查询语文成绩不等于60,或者年龄小于20的学生信息
stus = Student.objects.filter(~Q(language_score__gt=60) |
Q(s_age__lt=20))
Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面
Order.objects.get(
Q(create_time=date(2016, 10, 2)) | Q(create_time=date(2016, 10, 6)),
desc__startswith='Who'
)
数据的增加
def addStu(request):
if request.method == 'GET':
# 第一种方法
# stu = Student()
# stu.s_name = '大名'
# stu.s_age = '18'
# stu.language_score = 59
# stu.math_score = 59
# stu.save()
#
# 第二种方法 ---
# stu = Student('小小明', 25, 90, 80)
# stu.save()
# return HttpResponse('创建成功')
# 第三种
Student.objects.create(s_name='妲己', s_age= 50,language_score = 70, math_score = 90)
return HttpResponse('创建成功')
删除数据
def delStu(request):
if request.method == 'GET':
stu = Student.objects.filter(id=1)
stu.delete()
return HttpResponse('删除成功')
修改数据
def updateStudent(request):
if request.method == 'GET':
# 修改方法1
stu = Student.objects.filter(id=2).first()
stu.s_name = '小明明'
stu.save()
# 修改方法2
# Student.objects.filter(id=2).update(s_name='小明明明')
return HttpResponse('修改成功')
一对一的关联查询
一对一的关系可将关系字段定义在任意的一方
有关系字段的为A表,另一张为B表
从A查询B
格式:A的对象.关系字段名
从B查询A
格式:B的对象.A的模型名的小写
一对多的关联查询
关系字段定义在多的一方
多的一方为A表,另一张为B表
从A的查B:
格式:A的对象.关系字段名
从B查询A:
格式:B对象.A的模型名的小写_set.all()
多对多的关联查询以及添加、删除
查询:
关系字段可以定在任意一方
有关系字段的为A表,另一张为B表
从A查询B:
A的对象.关系字段名.all()
从B查询A:
B的对象.A的模型名的小写_set.all()
删除(针对中间表):
根据A表中的主键删除B表主键
删除课程id=1的学生id=3的学生
c2 = Course.objects.get(id=1)
stu2 = Student.objects.get(id=3)
c2.stu.remove(stu2)
根据B表中的主键删除A表主键
例子:删除id=3的学生的id=1的课程
stu = Student.objects.get(id=3)
c1 = Course.objects.get(id=1)
stu.course_set.remove(c1)
添加(针对中间表)
根据A表中的主键添加B表主键
例子:把id=2的课程给id=4的学生选修
stu4 = Student.objects.get(id=4)
c1 = Course.objects.get(id=1)
c1.stu.add(stu4)
根据B表中的主键添加B表主键
例子:给id=4学生添加id=1的课程
stu = Student.objects.get(id=4)
c1 = Course.objects.get(id=1)
stu.course_set.add(c1)
Django和Python的对应关系