Django模型增删改查

查询

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的对应关系

猜你喜欢

转载自blog.csdn.net/weixin_42750983/article/details/81949663