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操作之--模型类数据查询的更多相关文章
- Django项目的ORM操作之--数据模型类创建
在django项目中,其自带了ORM(Object Relation Mapping)对象关系映射框架,我们在django项目下app的models模块下对类进行操作,通过ORM会将我们对类的操作转化 ...
- Django学习之ORM操作
一.一般操作 二.必知必会13条 返回QuerySet对象的方法有 特殊的QuerySet 返回具体对象的 返回布尔值的方法有 返回数字的方法 三.单表查询之神奇的双下划线 四.ForeignKey操 ...
- Django专题之ORM操作2
Django ORM操作 目录 一般操作 看专业的官网文档,做专业的程序员! 回到顶部 必知必会13条 <1> all(): 查询所有结果 <2> get(**kwargs ...
- 跨过Nginx上基于uWSGI部署Django项目的坑
先说说他们的关系,Nginx和uWSGI都是Web服务器,Nginx负责静态内容,uWSGI负责Python这样的动态内容,二者配合共同提供Web服务以实现提高效率和负载均衡等目的.uWSGI实现了多 ...
- Python/Django(CBV/FBV/ORM操作)
Python/Django(CBV/FBV/ORM操作) CBV:url对应的类(模式) ##====================================CBV操作============ ...
- Django - 表与ORM操作
Django - 表与ORM操作 一. 模板语言 模板中也有自己的语言, 该语言可以实现数据展示 - {{ 变量 }} - 循环 {% for i in all_publisher %} {{ for ...
- 初学Django基础02 ORM操作
django的ORM操作 之前我们知道了models.py这个文件,这个文件是用来读取数据结构的文件,每次操作数据时都走这个模块 常用字段 AutoField int自增列,必须填入参数 primar ...
- docker笔记(3) ------Django项目的docker部署
2019-01-12 14:23:18 django容器连接到mysql_server容器分析:原myblog项目使用sqlit3数据库,使用mysql容器前需要在django中加入pymysql ...
- Django基础之ORM操作
################################################################## # PUBLIC METHODS THAT ALTER ATTRI ...
随机推荐
- OpenStack之基础知识
一.云计算 云计算(cloud computing)是基于互联网的相关服务的增加.使用和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源.云是网络.互联网的一种比喻说法.过去在图中往往 ...
- ::before ::after CSS3中的伪类和伪元素
::before和::after伪元素的用法 一.介绍 css3为了区分伪类和伪元素,伪元素采用双冒号写法. 常见伪类——:hover,:link,:active,:target,:not(),:fo ...
- Linux入门之--Linux文件系统结构
对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...
- uboot下如何查看内存里的数据
答:使用md工具 md.b $address $count (从地址$address处显示$count个字节的数据,b=byte,8位) md.w $address $count (从地址$addre ...
- 【转载】showModalDialog returnValue is undefined in Google Chrome
showModalDialog returnValue is undefined in Google Chrome Posted on August 22, 2012by briancaos For ...
- linux按照进程名杀掉进程
1.按照进程名杀掉进程 ps -ef | grep sftp | grep mysql |grep -v grep | awk '{print("kill -9 ", ...
- 使用GEOquery下载GEO数据--转载
最近需要下载一大批GEO上的数据,问题是我要下载的Methylation数据根本就没有sra文件,换言之不能使用Aspera之类的数据进行下载.但是后来我发现了GEOquery这个不错的R包,不知道是 ...
- thinkphp getField("xxxxx", true); 得到一个字段所有值组成的的数组
很多时候我们只需要一张表里某个字段的值,组成的数组 $Channel = D('channel');$channelList = $Channel->order('user_name')-> ...
- 设置table的td宽度,不随文字变宽
页面中table宽度设置width="600px"之后,宽度仍然不是固定的,文字太长后不换行,把table都撑变形了. 解决办法: table 设置 宽度,绝对宽度和相对都可以 t ...
- TileMode(平铺模式) 枚举的成员:
TileMode(平铺模式) 枚举的成员: 成员名称 说明 FlipX 与 Tile 相同,只不过图块的交替列被水平翻转. 基本图块本身不翻转. FlipXY FlipX 和 FlipY ...