1、条件查询-方法

ORM-查询操作-d21-4 - 图1

filter(条件)

  • 语法:MyModel.object.filter(属性1=值1,属性2=值2)
  • 作用:返回 包含条件的全部的数据集
  • 返回值:
    • QuerySet容器对象,内部存放 MyModel 模型类的实例
    • 返回一个list类型的需要循环,下标取值
  • 说明:

    • 多个属性在一起时为“”关系,即 and (当)

      exclude(条件)

  • 语法:MyModel.object.exclude(条件)

  • 作用:返回 不包含条件的全部的数据集
  • 返回值:

    • QuerySet容器对象,内部存放 MyModel 模型类的实例
    • 返回一个list类型的需要循环,下标取值

      get(条件)

  • 语法:MyModel.object.get(条件)

  • 作用:返回 满足条件的唯一一条数据
  • 说明:该方法只能返回一条数据(模型类的实例)
    • 查询结果多余一条数据抛出 .Model.MultipleObjectsReturned 异常
    • 查询无结果 也会报错


2、查询谓词

思考?如何做非等值的过滤查询(如 where id>1)

定义:做更灵活的条件查询时需要使用查询谓词
说明:每一个查询谓词是一个独立的查询功能

2.1、常用查询谓词

谓词 作用 示例
__exact 等值匹配 MyModel.object.filter(id__exact=1)
等同于 select * from mymodel where id = 1
__contains 包含指定值 MyModel.object.filter(__contains=’w’)
等同于 select * from mymodel where name like ‘%w%’
__startswith 以xxx开头
__endswith 以xxx结尾
__gt 大于指定值 MyModel.object.filter(age__gt=50)
等同于 select * from mymodel where age>50
__gte 大于等于
__lt 小于
__lte 小于等于
__in 查找数据是否在指定范围内 MyModel.object.filter(country__in=[‘中国’,’日本’,’韩国’])
等同于 select * from mymodel where country in(‘中国’,’日本’,’韩国’)
__range 查找数据是否在指定的区间范围内 MyModel.object.filter(age__range=(35,50))
等同于 select * from mymodel where age BETWEEN 35 and 50;
  1. ##### 查询条件 = != > < >= <= and or not in in order by group by
  2. # print(models.Teacher.objects.exclude(name="王老师")) # 不等于
  3. # print(models.Teacher.objects.filter(id__gt=3)) # 大于
  4. # print(models.Teacher.objects.filter(id__gte=3)) # 大于等于
  5. # print(models.Teacher.objects.filter(id__lte=3)) # 小于等于
  6. # print(models.Teacher.objects.filter(id__lt=3)) # 小于
  7. # print(models.Teacher.objects.filter(id__in=[1, 2, 3])) # 在范围里
  8. # print(models.Teacher.objects.exclude(id__in=[1, 2, 3])) # 不在xx里
  9. # print(models.Teacher.objects.filter(name__endswith="张")) # 某个字段以xx结尾
  10. # print(models.Teacher.objects.filter(name__startswith="老师")) # 某个字段以xx开头
  11. # print(models.Article.objects.filter(content__contains="vue")) # like
  12. # print(models.Article.objects.all().order_by('-id')) # 倒序排序
  13. # print(models.Article.objects.filter().order_by('-id'))
  14. # result = models.Article.objects.filter(Q(id=1) | Q(id=2))
  15. # print(result)
  16. # # print("!!!!!!!1",models.Article.objects.raw('select * from user_article'))
  17. # r = models.Article.objects.raw('select * from user_article') # 执行原生的sql
  18. # for i in r:
  19. # print(i)

3、Q对象 “或”

ORM “或”条件查询的使用

  1. from django.db.models import Q # orm “或”条件的使用
  2. result = models.Article.objects.filter(Q(id=1) | Q(id=2)) # id =1 or id =2
  3. print(result)

4、原生数据库操作

Django也可以支持 直接使用SQL语句的方式通信数据库
查询:使用MyModel.object.raw(sql语句)进行数据库查询操作
语法:使用 MyModel.object.raw(sql语句)
返回值:RawQuerySet 集合对象【只支持基础操作,比如循环】

  1. books = models.Book.objects.raw('select * from bookstore_book')
  2. for book in books:
  3. print(book)