数据库开发之ORM

本文详细介绍了Django ORM的常用操作,包括获取数据、条件查询、范围查询、空值判断、模糊查询以及聚合函数和分组查询的使用。通过实例展示了如何查询学生信息、筛选特定条件的数据,并探讨了多表连接查询的实现方式,适用于Django初学者和进阶开发者提升数据库操作技能。
摘要由CSDN通过智能技术生成
1. 获取所有数据
results = models.Student.objects.all().values() 
2. 判断相等
results = models.Student.objects.filter(gender='男')
results = models.Student.objects.filter(gender__exact='男')
results = models.Student.objects.filter(sage__exact=None)
3. 大于小于
 # 年龄大于等于25岁
results = models.Student.objects.filter(sage__gte=25) 
 # 年龄小于等于25岁
results = models.Student.objects.filter(sage__lte=25) 
4. in--- 在某一个list范围内 
 # 查询出姓名登录Alice,bob
results = models.Student.objects.filter(sname__in =['Alice','Bob']) 

4. range-- 某一个范围 ,相当于SQL中的Between --- and ---
   results = models.Student.objects.filter(sage__range =(25,30)) 

5. 判断是空 --isnull
 results = models.Student.objects.filter(sage__isnull=True) 

==================练习=============
查询出姓名为“陈鹏”的学号、手机号码和邮箱地址
results = models.Student.objects.filter(sname='陈鹏') 
results = models.Student.objects.filter(sage__exact='陈鹏') 
results = models.Student.objects.filter(sage__in=['陈鹏']) 
查询出姓名不是“陈鹏”的学生的所有信息
results = models.Student.objects.exclude(sname__exact='陈鹏') 
查询出大于25的女生的学生信息
results = models.Student.objects.filter(sage__gte=25, gender__exact='女') 
查询出学生年龄介于20到30间的学生学号和姓名
results = models.Student.objects.filter(sage__range=(20,30))
查询哪些学生没有填写“年龄”信息
results = models.Student.objects.filter(sage__exact=None) 
results = models.Student.objects.filter(sage__isnull=True) 
查询出“陈鹏”,”Alice”,”Bob”的学号,年龄
results = models.Student.objects.filter(sname__in=['Alice','Bob','陈鹏']) 



=================模糊查询 ================
1. 模糊查询 --- startswith, endswith, contains
   # 查询出以134开头的手机号码
   students = models.Student.objects.filter(stumobile__startswith='134').values()
  # 查询出以8开头的手机号码
  students = models.Student.objects.filter(stumobile__endswith='5').values()
  # 查询手机号码中包含88
  students = models.Student.objects.filter(stumobile__contains='88').values()


====模糊查询练习====
查询出所有姓“陈”的学生
  students = models.Student.objects.filter(sname__startswith='陈').values()
查询出手机号码134或者135开头,倒数第四位为不是7也不是8的学生姓名
  students = models.Student.objects.filter(stumobile__regex=r'^[1][3][45][0-9]{4}[^78][0-9]{3}$' ).values
查询出借过书的同学的学号 
 results = models.Borrowbook.objects.all().values("sno_id").distinct()
对Student表按照年龄升序排序,如果年龄一样,女生排在男生前面 
 results = models.Student.objects.all().order_by('sage','gender').values()
查询出Student表中的前5行记录
 results = models.Student.objects.all()[0:5].values()



===== 聚和函数练习 ===========
1.   统计出学生最大年龄,最小年龄
 results = models.Student.objects.aggregate(max_age = Max('sage'), min_age = Min('sage'))
2.   查询出男生的平均年龄
results = models.Student.objects.filter(gender__exact='男').aggregate(avg=Avg('sage'))
3.   查询出有多少位学生借书
results = models.Borrowbook.objects.aggregate(number = Count('sno',distinct=True))
4.   查询出计算机类的图书总共有多少本
results = models.Book.objects.filter(booktype__exact=1).aggregate(sum_num = Sum('booksumno'))


====分组查询 -===== 
 # 统计出男女生的人数
    results = models.Student.objects.values('gender').annotate(number=Count('gender'))
    # 统计出每一类书中的最高的价格
    results = models.Book.objects.values('booktype').annotate(maxprice=Max('bookprice'))
    # 统计出每一类书中的最高的价格大于等于45元
    results = models.Book.objects.values('booktype').annotate(maxprice=Max('bookprice')).filter(maxprice__gte=45.0)
    # 查询出借的超过两本的书的ID号及数量
    results = models.Borrowbook.objects.values('bookid').annotate(number=Count('id')).filter(number__gt=2)
    # 统计出借书多于两本的学生学号以及数量,按照数量的降序排列
    results = models.Borrowbook.objects.values('sno').annotate(number=Count('id')).filter(number__gt=2).order_by('-number')


====连接查询=======
# 由一查多 : 给定的条件在主键表中,要查询的内容在外键表中 --- 正向查询
    # 比如查询:李明志 写了哪些书?
    # 多类名.objects.filter(关联属性__一类属性名=具体条件)
    results = models.Book.objects.filter(bookauthor__authorname__exact='李明志').values()

    # 由多查一: 给定的条件在外键表中,要查询的内容在主键表中 --- 反向查询
    # 比如:查询95006这本书的出版社
    # 公式: 一类名.objects.filter(多类名小写__多类属性名=具体条件
    results = models.Press.objects.filter(book__bookid__exact=39006).values()

    # 查询出陈鹏所借的图书id
    # Student : BorrowBook  关系 : 1对多  有一查多
    results = models.Borrowbook.objects.filter(sno__sname__exact='陈鹏').values()

    # 95005的书被哪些同学借
    # 由BorrowBook 去查 Student  关系: 多查一
    results = models.Student.objects.filter(borrowbook__bookid__exact=39009).values()

    # 多表连接案例01:查询出陈鹏所借的图书的作者
    # 表的关联图:
    #    Student --1:多--> BorrowBook --多:1-->  Book  --多:1-->  Author
    #    Author <---1:多 ---Book <--1:多 ---BorrowBook <-- 多:1----Student
                 #book__borrowbook__sno__sname = '陈鹏'
    results = models.Author.objects.filter(book__borrowbook__sno__sname='陈鹏').distinct().values()

    # 多表连接案例02:查询出计算机类的图书有哪些同学借
    # 表的关联图
    # Student <--1:多 -- Borrowbook <-- 多:1--Book<-- 多:1--BookType
     #   borrowbook   bookid   booktype  typename='计算机'
    results = models.Student.objects.filter(borrowbook__bookid__booktype__typename='计算机').distinct().values()
    # 输入返回对象类型
    print("返回对象类型:", type(results))
    print(results)






















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值