Django项目的ORM操作之--模型类数据查询
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django项目的ORM操作之--模型类数据查询相关的知识,希望对你有一定的参考价值。
1.查询基本格式及理解: 类名.objects.[查询条件]
例如我们要查询数据库中一张表(bookinfo)的所有数据,sql语句为:select * from bookinfo,
对应模型类的操作是: BookInfo.objects.all()
cd到当前django项目的目录下,进入携带django环境的python解释器进行测试操作:
$ python manage.py shell
$ from book_app.models import *
即可进行模型对象的语句语句操作,执行以下语句看看我们查询的到底是什么东西
$ type(BookInfo.objects) --> <class ‘django.db.models.manager.Manager‘>
$ type(BookInfo.objects.all()) --> <class ‘django.db.models.manager.Manager.QuerySet‘>
$ type(BookInfo.objects.all()[0]) --> <class ‘django.db.models.manager.Manager.BookInfo‘>
也就是说,objects是一个模块对象管理器,objects.all是一个查询集QuerySet,
取查询集的第一个元素QuerySet[0],可以看到查询集里面存的元素就是符合条件的我们设计表时所创建类BookInfo的实例对象
QuerySet查询集支持小标和切片,切片返回的是一个新的查询集
2.查询集之过滤器:
多对象过滤器:
all() --> 返回所有数据
filter([条件]) --> 返回满足条件的所有数据
exclude([条件]) --> 返回满足条件外的所有数据
order_by([条件]) --> 根据条件排序,并返回 (可以用‘-‘实现倒序)
单对象过滤器:
get([条件]) --> 返回满足条件的单个数据;如果未找到将抛出异常:DoesNotExist;如果找到的是多条将抛出异常:MultipleObjectsReturned
count() --> 返回查询结果总数
aggregate() --> 聚合,返回一个字典 (聚合函数:Avg、Max、Min、Sum、Count,例: objects.aggregate(Sum("name")))
判空:
exists() --> 判断查询集中是否有数据,有为True
返回具体对象属性值:
values([属性名]) --> 返回一个列表,以字典形式存放所有对象的属性值
values_list([属性名]) --> 返回一个列表,以列表形式存放所有对象的属性值
3.filter查询集的条件查询:
查询条件的格式: [属性名称]__[运算符]=[值] (注意是两个"_",我们在对属性命名时不允许使用双"_")
属性大小、范围查询:
等于:属性=值 大于:属性__gt=值 大于等于:属性__gte=值
小于:属性__lt=值 小于等于:属性__lte=值 范围:属性_in=值(值应为可选项的列表,例: id_in=[1,3,5],指定id=1、3、5的3个数据)
查询属性为空的/不为空:
属性__isnull=True/False
属性模糊查询:
指定开头:属性__startwith=值 指定结尾:属性__endwith=值
指定日期(属性值应为日期相应类型):属性_year=值 属性_month=值(例:birthday_month=11,指定birthday的月份为11月的数据)
F对象和Q对象: 需先导入: from django.db.models import F,Q
F对象:不知道某个属性的值,也可以用它来进行比较,例: filter(read_gt=F(‘comment‘)*2), 查询阅读数量大于评论数量2倍的数据
Q对象:实现逻辑与、非的查询
与: objects.filter(read_gt=20).filter(comment_gt=20) 阅读和评论数都大于20
或: objects.filter(Q(read_gt=20 | comment_gt=20)) 阅读数大于20或评论数大于20
非: objects.filter(-Q(read_gt=20)) 阅读数不大于20
4.过滤器的特性:懒惰和缓存
懒惰:创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用等
缓存:使用同一个查询集,第一次使用时会发生数据库的查询,然后把结果缓存下来,再次使用这个查询集时会使用缓存的数据。
以上是关于Django项目的ORM操作之--模型类数据查询的主要内容,如果未能解决你的问题,请参考以下文章