ORM(三)QuerySet查询字段操作
这里的环境还是用上次的环境:
Django项目:orm_practice
app/models.py中有如下几个类:
publishing表内容如下:
pid name
1 机械工业出版社
2 电子工业出版社
3 人民出版社
4 图灵出版社
5 科学出版社
app_publishing
app_books表内容如下:
bid name price pid_id
1 雪山飞狐 40 3
2 三国演义 50 1
3 天龙八部 60 3
4 红楼梦 50 2
5 C语言程序设计 80 4
6 水浒传 50 5
app_author表内容如下:
aid name
1 金庸
2 罗贯中
3 曹雪芹
4 施耐庵
5 丹尼斯里奇
app_author_books表内容如下:
id author_id books_id
1 1 1
2 1 3
3 2 2
4 3 4
5 4 6
6 5 5
有了以上的表后,下面进行字段操作,在进行操作之前我们先创建一个脚本,用于运行ORM的语句。
脚本内容:
import os if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings")
import django
django.setup()
orm运行脚本
这里新建一个script的目录,在该目录下新建一个script.py的Python文件,在里面添加上面的脚本头,最后看起来像下面这个样子:
1、表的查询QuerySet
all():以列表的形式返回表中所有字段信息。
语法:models.表名.objects.all()
import os
if __name__ == '__main__':
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings")
import django
django.setup() from app import models
obj = models.Publishing.objects.all() # 获取Publishing表中所有字段信息
print(obj,type(obj)) # 打印publishing表总所有字段 # 打印内容如下
<QuerySet [<Publishing: Publishing object>, <Publishing: Publishing object>, <Publishing: Publishing object>,
<Publishing: Publishing object>, <Publishing: Publishing object>]> <class 'django.db.models.query.QuerySet'>
可能结果我们返回的字段类型class 'django.db.models.query.QuerySet' ,并且打印的内容也不是很友好,这是因为我们没有处理字段如何显示(也就是没有处理表中的属性如何显示),我们在创建publishing类时继承了models.Model类,class Publishing(models.Model):由于我们没有处理字段显示,所以就到父类中去寻找显示字段的方法,而父类models.Model为我们定义了__str__方法用于显示字段,所以我们看到的字段信息是继承了父类的显示方法。
既然我们知道了字段显示方法,那么我们就可以自己定义字段显示方法__str__()。
再次打印publishing表的字段信息,为便于查看结果,这回使用for循环的方式打印:
obj_all = models.Publishing.objects.all()
for obj in obj_all:
print(obj.pid,obj.name)
print(type(obj_all)) # 打印内容如下
1 机械工业出版社
2 电子工业出版社
3 人民出版社
4 图灵出版社
5 科学出版社
<class 'django.db.models.query.QuerySet'>
fileter(*args, **kwargs):如果不写参数,默认返回所有表字段信息。关键字参数kwargs用于设置查询条件,返回QuerySet类型列表。
语法:models.表名.objects.filter(关键字参数)
obj_list = models.Publishing.objects.filter() # 没有设置查找条件,默认打印表中所有内容
for obj in obj_list:
print(obj.pid,obj.name) # 打印内容如下
1 机械工业出版社
2 电子工业出版社
3 人民出版社
4 图灵出版社
5 科学出版社
查找pid = 3的出版社。
obj_list = models.Publishing.objects.filter(pid=3)
print(obj_list[0].pid,obj_list[0].name,type(obj_list)) # filter返回的是一个QuerySet类型的列表,这里需要注意下。 # 打印内容如下
3 人民出版社 <class 'django.db.models.query.QuerySet'>
这里需要注意的是filter(条件)返回的是QuerySet类型的列表的所有符合条件的字段信息,还有一个地方就是Django为我们将主键位置封装了一个类似别名pk,这样我们在使用主键作为条件查找时,如果不记得主键名称可以使用pk来代替主键。如下pk=3将得到和上面一样的结果:
# obj_list = models.Publishing.objects.filter(pid=3)
obj_list = models.Publishing.objects.filter(pk=3) # 这里使用pk作为主键进行查找
print(obj_list[0].pid,obj_list[0].name,type(obj_list)) # 打印内容如下
3 人民出版社 <class 'django.db.models.query.QuerySet'>
exclude(*args, **kwargs):如果不写参数,会显示所有字段信息。指定排除条件kwargs,返回与条件不匹配的QuerySet类型列表。
语法:models.表名.objects.exclude(关键字参数)
obj_list = models.Publishing.objects.exclude(pk=2) # 这里排除主键是2的对象
for obj in obj_list:
print(obj.pid,obj.name) # 打印内容如下
1 机械工业出版社
3 人民出版社
4 图灵出版社
5 科学出版社
order_by(*field_names):根据字段名就行排序。
obj_all = models.Publishing.objects.all().order_by("pk") # 升序
for obj in obj_all:
print(obj.pid,obj.name) # 打印内容如下
1 机械工业出版社
2 电子工业出版社
3 人民出版社
4 图灵出版社
5 科学出版社
下面是降序:
obj_all = models.Publishing.objects.all().order_by("-pk") # 在字段前加一个负号代表降序
for obj in obj_all:
print(obj.pid,obj.name) # 打印内容如下
5 科学出版社
4 图灵出版社
3 人民出版社
2 电子工业出版社
1 机械工业出版社
reverse():将列表对象颠倒,必须要和order_by配合使用,否则不生效。
obj_all = models.Publishing.objects.all().order_by("pk")
for obj in obj_all[:3]: # 打印列表的前三个对象
print(obj.pid,obj.name)
print("-"*20)
for obj in obj_all.reverse()[:3]: # 颠倒后打印列表的前三个对象
print(obj.pid,obj.name) # 打印内容如下
1 机械工业出版社
2 电子工业出版社
3 人民出版社
--------------------
5 科学出版社
4 图灵出版社
3 人民出版社
values(*fields, **expressions):将QuerySet类型列表中的对象转换成字典。可指定*fields只查看要显示的字段。
obj_all = models.Publishing.objects.all().values()
print(obj_all,type(obj_all)) # 打印内容如下
<QuerySet [{'pid': 1, 'name': '机械工业出版社'},
{'pid': 2, 'name': '电子工业出版社'}, {'pid': 3, 'name': '人民出版社'}, {'pid': 4, 'name': '图灵出版社'},
{'pid': 5, 'name': '科学出版社'}]> <class 'django.db.models.query.QuerySet'>
指定*fields只查看书籍的bid、name、price字段:
obj_all = models.Books.objects.all().values("bid","name","price") # 只查看书籍的bid、name、price字段
for obj in obj_all:
print(list(obj.items())) # 使用items()查看字典中的值 # 打印内容如下
[('bid', 1), ('name', '雪山飞狐'), ('price', 40)]
[('bid', 2), ('name', '三国演义'), ('price', 50)]
[('bid', 3), ('name', '天龙八部'), ('price', 60)]
[('bid', 4), ('name', '红楼梦'), ('price', 50)]
[('bid', 5), ('name', 'C语言程序设计'), ('price', 80)]
[('bid', 6), ('name', '水浒传'), ('price', 50)]
distinct(*field_names):去除重复行,需要注意的是参数field_names在PostgreSQL中可以用,在mysql不能使用该值。
obj_all = models.Books.objects.all().values("price")
for obj in obj_all: # 打印所有价格
print(list(obj.items()))
print("-"*20)
for obj in obj_all.distinct(): # 去掉重复价格
print(list(obj.items())) # 打印内容如下
[('price', 40)]
[('price', 50)]
[('price', 60)]
[('price', 50)]
[('price', 80)]
[('price', 50)]
--------------------
[('price', 40)]
[('price', 50)]
[('price', 60)]
[('price', 80)]
values_list(*fields, **kwargs):fields用于指定字段显示,以元组的形式返回结果,kwargs有一个参数flat用于将数据转换成原数据类型,但只能转换一个值。
指定"bid","name","price"字段打印内容:
obj_all = models.Books.objects.all().values_list("bid","name","price")
for obj in obj_all: # 打印所有价格
print(obj) # 打印内容如下
(1, '雪山飞狐', 40)
(2, '三国演义', 50)
(3, '天龙八部', 60)
(4, '红楼梦', 50)
(5, 'C语言程序设计', 80)
(6, '水浒传', 50)
指定"name"字段使用flat=True打印"name"的原数据类型。
obj_all = models.Books.objects.all().values_list("name",flat=True)
for obj in obj_all: # 打印所有价格
print(obj) # 打印内容如下
雪山飞狐
三国演义
天龙八部
红楼梦
C语言程序设计
水浒传
dates(field_name, kind, order='ASC'):
field_name:字段名
kind:取值范围是"year", "month", "day"
year:返回该字段的所有不同年份值的列表。
month:返回该字段的所有不同年/月值的列表。
day:返回该字段的所有不同年/月/日值的列表。
order:"ASC","DESC"
我们在书籍字段中插入一列日期记录,插入后的表如下:
bid name pid_id price date
1 雪山飞狐 3 40 2019-04-10
2 三国演义 1 50 2019-04-09
3 天龙八部 3 60 2018-04-10
4 红楼梦 2 50 2017-04-10
5 C语言程序设计 4 80 2019-02-10
6 水浒传 5 50 2019-04-10
下面分别对去除重复的年,月,日:
obj_year = models.Books.objects.dates("date","year") # 去掉相同年份的
obj_month = models.Books.objects.dates("date","month") # 去掉同年同月
obj_day = models.Books.objects.dates("date","day") # 去掉同年同月同日生
for obj in obj_year: # 去掉相同年份的
print(obj)
print("-"*20)
for obj in obj_month: # 去掉同年同月
print(obj)
print("-"*20)
for obj in obj_day: # 去掉同年同月同日生
print(obj) # 打印内容如下
2017-01-01
2018-01-01
2019-01-01
--------------------
2017-04-01
2018-04-01
2019-02-01
2019-04-01
--------------------
2017-04-10
2018-04-10
2019-02-10
2019-04-09
2019-04-10
datetimes(field_name, kind, order='ASC', tzinfo=None):与dates()类似,这里不演示了。
ield_name:字段名
kind:取值范围是"year", "month", "day"
year:返回该字段的所有不同年份值的列表。
month:返回该字段的所有不同年/月值的列表。
day:返回该字段的所有不同年/月/日值的列表。
"hour":返回该字段的所有不同年/月/日 小时值的列表。
"minute":返回该字段的所有不同年/月/日 小时:分钟值的列表。
"second"::返回该字段的所有不同年/月/日 小时:分钟:秒值的列表。
order:"ASC","DESC"
none():将创建一个永远不会返回任何对象的查询集,并且在访问结果时不会执行任何查询。
obj_all = models.Books.objects.all().none()
print(obj_all) # 打印内容如下
<QuerySet []>
exists():如果获取到结果返回True,否则返回False。
obj_list = models.Books.objects.filter(pk=1).exists() # 表中存在的主键
obj_list2 = models.Books.objects.filter(pk=10).exists() # 表中不存在的主键
print(obj_list)
print(obj_list2) # 打印内容如下
True
False
first()、last():获取第一个和获取最后一个对象。
obj_list = models.Books.objects.all() print(obj_list.first()) # 获取第一个对象
print(obj_list.last()) # 获取最后一个对象 # 打印内容如下
雪山飞狐 - 40
水浒传 - 50
上面只显示书籍名字,和价格的原因是。我们在Books表中的显示方式只指定了name和price
count():获取对象个数。
obj_num = models.Books.objects.all().count()
print(obj_num) # 打印内容如下
6
get(*args, **kwargs):必须给定查找条件,如果不指定查找条件会报错,并且查找条件的匹配结果必须是只有一条记录,如果返回多条记录也会报错,如果查找条件没有匹配的结果也会报错。所以在使用get时必须非常确根据条件肯定能获取到结果,且结果只有一条记录。否则会报错。get是直接返回查找到的记录(也就是类的对象)。
obj = models.Publishing.objects.get(pk=4)
print(obj.name,type(obj)) # 打印内容如下
图灵出版社 <class 'app.models.Publishing'>
参考网址:https://docs.djangoproject.com/en/1.11/ref/models/querysets/
ORM(三)QuerySet查询字段操作的更多相关文章
- Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询
Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...
- Django框架详细介绍---ORM相关操作---select_related和prefetch_related函数对 QuerySet 查询的优化
Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化 引言 在数据库存在外键的其情况下,使用select_related()和pre ...
- Django ORM (三) 查询,删除,更新操作
ORM 查询操作 修改 views.py 文件 from django.shortcuts import render, HttpResponse from app01 import models f ...
- QGis(三)查询矢量图层的要素属性字段值(转载)
QGis(三)查询矢量图层的要素属性字段值 https://github.com/gwaldron/osgearth/issues/489 当加载一个矢量图层后,如果要查看要素的属性字段值,则需要实现 ...
- ORM中基于对象查询与基于queryset查询
感谢老男孩~ 一步一步走下去 前面是视图函数 后面是表结构models.py from django.shortcuts import render, HttpResponse from djang ...
- ORM基础4 跨表查询+原子性操作
一.跨表查询 1.# # 正向查找 对象查找 # book_obj = models.Book.objects.get(id=3) # print(book_obj) # ret = book_obj ...
- Django ORM中的查询,删除,更新操作
ORM查询操作 修改views.py文件 from django.shortcuts import render, HttpResponse from app01 import models from ...
- python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)
12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...
- ORM多表查询下
一.多表查询 1.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接 ...
随机推荐
- 基于java的ES开发
3.1 环境配置 Jdk 1.8及以上 Elasticsearch.client 5.5.2(与服务器版本一致) Log4j 2.7及以下 maven工程必要的jar包依赖 <project x ...
- sap 内表
内表的目的在ABAP/4中,主要使用表格.表格是R/3系统中的关键数据结构.长期使用的数据存储在关系数据库表格中.关于如何读取和处理数据库表格的详细信息,参见读取并处理数据库表.除了数据库表格,还可以 ...
- 如何发布jar包到maven中央仓库
自使用maven以来,没少使用maven中央仓库中的各种jar包,方便有效,但是咱们也不能总是只取不予,也应该懂得奉献,当你写好了一个十分好用的jar包,想贡献出去给大家使用的时候,应该怎么做呢?当然 ...
- ajax跨域问题(php)
ajax出现请求跨域错误问题,主要原因就是因为浏览器的"同源策略". 解决方法(我只用过下面这3种): 1. 架设服务器代理:即浏览器请求同源服务器,再由后者请求外部服务(之前博主 ...
- 解决mongodb的安装mongod命令不是内部或外部命令
1:安装 去mongodb的官网http://www.mongodb.org/downloads下载32bit的包 解压后会出现以下文件 在安装的盘C:下建立mongodb文件夹,拷贝bin文件夹到该 ...
- Android 实现形态各异的双向侧滑菜单 自定义控件来袭
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39670935,本文出自:[张鸿洋的博客] 1.概述 关于自定义控件侧滑已经写了两 ...
- 【ShoppingWebCrawler】-基于Webkit内核的爬虫蜘蛛引擎概述
写在开头 在各个电商平台发展日渐成熟的今天.很多时候,我们需要一些平台上的基础数据.比如:商品分类,分类下的商品详细,甚至业务订单数据.电商平台大多数提供了相应的业务接口.允许ISV接入,用来扩展自身 ...
- java没有firendly访问类型
java中只有public.private.protected.default这几种修饰符,没有friendly修饰符,没加修饰符就是friendly.friendly只是一种说法,把它认为是defa ...
- laravel 分页和共多少条 加参数的分页链接
<div class="pagers "> <span class="fs pager">共 {{$trades->total() ...
- Centos打开、关闭、结束tomcat,及查看tomcat运行日志
cd到tomcat目录下之后 启动:一般是执行sh bin/startup.sh 停止:一般是执行sh bin/shutdown.sh查看:执行ps -ef |grep tomcat 输出如下 *** ...