这里的环境还是用上次的环境:

Django项目:orm_practice

app/models.py中有如下几个类:

models.py

publishing表内容如下:

  1. pid name
  2. 1 机械工业出版社
  3. 2 电子工业出版社
  4. 3 人民出版社
  5. 4 图灵出版社
  6. 5 科学出版社

app_publishing

app_books表内容如下:

  1. bid name price pid_id
  2. 1 雪山飞狐 40 3
  3. 2 三国演义 50 1
  4. 3 天龙八部 60 3
  5. 4 红楼梦 50 2
  6. 5 C语言程序设计 80 4
  7. 6 水浒传 50 5

app_author表内容如下:

  1. aid name
  2. 1 金庸
  3. 2 罗贯中     
  4. 3 曹雪芹     
  5. 4 施耐庵     
  6. 5 丹尼斯里奇   

app_author_books表内容如下:

  1. id author_id books_id
  2. 1 1 1
  3. 2 1 3
  4. 3 2 2
  5. 4 3 4
  6. 5 4 6
  7. 6 5 5

有了以上的表后,下面进行字段操作,在进行操作之前我们先创建一个脚本,用于运行ORM的语句。

脚本内容:

  1. import os
  2.  
  3. if __name__ == '__main__':
  4. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings")
  5. import django
  6. django.setup()

orm运行脚本

这里新建一个script的目录,在该目录下新建一个script.py的Python文件,在里面添加上面的脚本头,最后看起来像下面这个样子:

1、表的查询QuerySet

all():以列表的形式返回表中所有字段信息。

语法:models.表名.objects.all()

  1. import os
  2. if __name__ == '__main__':
  3. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings")
  4. import django
  5. django.setup()
  6.  
  7. from app import models
  8. obj = models.Publishing.objects.all() # 获取Publishing表中所有字段信息
  9. print(obj,type(obj)) # 打印publishing表总所有字段
  10.  
  11. # 打印内容如下
  12. <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循环的方式打印:

  1. obj_all = models.Publishing.objects.all()
  2. for obj in obj_all:
  3. print(obj.pid,obj.name)
  4. print(type(obj_all))
  5.  
  6. # 打印内容如下
  7. 1 机械工业出版社
  8. 2 电子工业出版社
  9. 3 人民出版社
  10. 4 图灵出版社
  11. 5 科学出版社
  12. <class 'django.db.models.query.QuerySet'>

fileter(*args, **kwargs):如果不写参数,默认返回所有表字段信息。关键字参数kwargs用于设置查询条件,返回QuerySet类型列表。

语法:models.表名.objects.filter(关键字参数)

  1. obj_list = models.Publishing.objects.filter() # 没有设置查找条件,默认打印表中所有内容
  2. for obj in obj_list:
  3. print(obj.pid,obj.name)
  4.  
  5. # 打印内容如下
  6. 1 机械工业出版社
  7. 2 电子工业出版社
  8. 3 人民出版社
  9. 4 图灵出版社
  10. 5 科学出版社

查找pid = 3的出版社。

  1. obj_list = models.Publishing.objects.filter(pid=3)
  2. print(obj_list[0].pid,obj_list[0].name,type(obj_list)) # filter返回的是一个QuerySet类型的列表,这里需要注意下。
  3.  
  4. # 打印内容如下
  5. 3 人民出版社 <class 'django.db.models.query.QuerySet'>

这里需要注意的是filter(条件)返回的是QuerySet类型的列表的所有符合条件的字段信息,还有一个地方就是Django为我们将主键位置封装了一个类似别名pk,这样我们在使用主键作为条件查找时,如果不记得主键名称可以使用pk来代替主键。如下pk=3将得到和上面一样的结果:

  1. # obj_list = models.Publishing.objects.filter(pid=3)
  2. obj_list = models.Publishing.objects.filter(pk=3) # 这里使用pk作为主键进行查找
  3. print(obj_list[0].pid,obj_list[0].name,type(obj_list))
  4.  
  5. # 打印内容如下
  6. 3 人民出版社 <class 'django.db.models.query.QuerySet'>

exclude(*args, **kwargs):如果不写参数,会显示所有字段信息。指定排除条件kwargs,返回与条件不匹配的QuerySet类型列表。

语法:models.表名.objects.exclude(关键字参数)

  1. obj_list = models.Publishing.objects.exclude(pk=2) # 这里排除主键是2的对象
  2. for obj in obj_list:
  3. print(obj.pid,obj.name)
  4.  
  5. # 打印内容如下
  6. 1 机械工业出版社
  7. 3 人民出版社
  8. 4 图灵出版社
  9. 5 科学出版社

order_by(*field_names):根据字段名就行排序。

  1. obj_all = models.Publishing.objects.all().order_by("pk") # 升序
  2. for obj in obj_all:
  3. print(obj.pid,obj.name)
  4.  
  5. # 打印内容如下
  6. 1 机械工业出版社
  7. 2 电子工业出版社
  8. 3 人民出版社
  9. 4 图灵出版社
  10. 5 科学出版社

下面是降序:

  1. obj_all = models.Publishing.objects.all().order_by("-pk") # 在字段前加一个负号代表降序
  2. for obj in obj_all:
  3. print(obj.pid,obj.name)
  4.  
  5. # 打印内容如下
  6. 5 科学出版社
  7. 4 图灵出版社
  8. 3 人民出版社
  9. 2 电子工业出版社
  10. 1 机械工业出版社

reverse():将列表对象颠倒,必须要和order_by配合使用,否则不生效。

  1. obj_all = models.Publishing.objects.all().order_by("pk")
  2. for obj in obj_all[:3]: # 打印列表的前三个对象
  3. print(obj.pid,obj.name)
  4. print("-"*20)
  5. for obj in obj_all.reverse()[:3]: # 颠倒后打印列表的前三个对象
  6. print(obj.pid,obj.name)
  7.  
  8. # 打印内容如下
  9. 1 机械工业出版社
  10. 2 电子工业出版社
  11. 3 人民出版社
  12. --------------------
  13. 5 科学出版社
  14. 4 图灵出版社
  15. 3 人民出版社

values(*fields, **expressions):将QuerySet类型列表中的对象转换成字典。可指定*fields只查看要显示的字段。

  1. obj_all = models.Publishing.objects.all().values()
  2. print(obj_all,type(obj_all))
  3.  
  4. # 打印内容如下
  5. <QuerySet [{'pid': 1, 'name': '机械工业出版社'},
  6. {'pid': 2, 'name': '电子工业出版社'}, {'pid': 3, 'name': '人民出版社'}, {'pid': 4, 'name': '图灵出版社'},
    {'pid': 5, 'name': '科学出版社'}]> <class 'django.db.models.query.QuerySet'>

指定*fields只查看书籍的bid、name、price字段:

  1. obj_all = models.Books.objects.all().values("bid","name","price") # 只查看书籍的bid、name、price字段
  2. for obj in obj_all:
  3. print(list(obj.items())) # 使用items()查看字典中的值
  4.  
  5. # 打印内容如下
  6. [('bid', 1), ('name', '雪山飞狐'), ('price', 40)]
  7. [('bid', 2), ('name', '三国演义'), ('price', 50)]
  8. [('bid', 3), ('name', '天龙八部'), ('price', 60)]
  9. [('bid', 4), ('name', '红楼梦'), ('price', 50)]
  10. [('bid', 5), ('name', 'C语言程序设计'), ('price', 80)]
  11. [('bid', 6), ('name', '水浒传'), ('price', 50)]

distinct(*field_names):去除重复行,需要注意的是参数field_names在PostgreSQL中可以用,在mysql不能使用该值。

  1. obj_all = models.Books.objects.all().values("price")
  2. for obj in obj_all: # 打印所有价格
  3. print(list(obj.items()))
  4. print("-"*20)
  5. for obj in obj_all.distinct(): # 去掉重复价格
  6. print(list(obj.items()))
  7.  
  8. # 打印内容如下
  9. [('price', 40)]
  10. [('price', 50)]
  11. [('price', 60)]
  12. [('price', 50)]
  13. [('price', 80)]
  14. [('price', 50)]
  15. --------------------
  16. [('price', 40)]
  17. [('price', 50)]
  18. [('price', 60)]
  19. [('price', 80)]

values_list(*fields, **kwargs):fields用于指定字段显示,以元组的形式返回结果,kwargs有一个参数flat用于将数据转换成原数据类型,但只能转换一个值。

指定"bid","name","price"字段打印内容:

  1. obj_all = models.Books.objects.all().values_list("bid","name","price")
  2. for obj in obj_all: # 打印所有价格
  3. print(obj)
  4.  
  5. # 打印内容如下
  6. (1, '雪山飞狐', 40)
  7. (2, '三国演义', 50)
  8. (3, '天龙八部', 60)
  9. (4, '红楼梦', 50)
  10. (5, 'C语言程序设计', 80)
  11. (6, '水浒传', 50)

指定"name"字段使用flat=True打印"name"的原数据类型。

  1. obj_all = models.Books.objects.all().values_list("name",flat=True)
  2. for obj in obj_all: # 打印所有价格
  3. print(obj)
  4.  
  5. # 打印内容如下
  6. 雪山飞狐
  7. 三国演义
  8. 天龙八部
  9. 红楼梦
  10. C语言程序设计
  11. 水浒传

dates(field_name, kind, order='ASC'):

field_name:字段名

kind:取值范围是"year", "month", "day"

year:返回该字段的所有不同年份值的列表。

   month:返回该字段的所有不同年/月值的列表。

   day:返回该字段的所有不同年/月/日值的列表。

order:"ASC","DESC"

我们在书籍字段中插入一列日期记录,插入后的表如下:

  1. bid name pid_id price date
  2. 1 雪山飞狐 3 40 2019-04-10
  3. 2 三国演义 1 50 2019-04-09
  4. 3 天龙八部 3 60 2018-04-10
  5. 4 红楼梦 2 50 2017-04-10
  6. 5 C语言程序设计 4 80 2019-02-10
  7. 6 水浒传 5 50 2019-04-10

下面分别对去除重复的年,月,日:

  1. obj_year = models.Books.objects.dates("date","year") # 去掉相同年份的
  2. obj_month = models.Books.objects.dates("date","month") # 去掉同年同月
  3. obj_day = models.Books.objects.dates("date","day") # 去掉同年同月同日生
  4. for obj in obj_year: # 去掉相同年份的
  5. print(obj)
  6. print("-"*20)
  7. for obj in obj_month: # 去掉同年同月
  8. print(obj)
  9. print("-"*20)
  10. for obj in obj_day: # 去掉同年同月同日生
  11. print(obj)
  12.  
  13. # 打印内容如下
  14. 2017-01-01
  15. 2018-01-01
  16. 2019-01-01
  17. --------------------
  18. 2017-04-01
  19. 2018-04-01
  20. 2019-02-01
  21. 2019-04-01
  22. --------------------
  23. 2017-04-10
  24. 2018-04-10
  25. 2019-02-10
  26. 2019-04-09
  27. 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():将创建一个永远不会返回任何对象的查询集,并且在访问结果时不会执行任何查询。

  1. obj_all = models.Books.objects.all().none()
  2. print(obj_all)
  3.  
  4. # 打印内容如下
  5. <QuerySet []>

exists():如果获取到结果返回True,否则返回False。

  1. obj_list = models.Books.objects.filter(pk=1).exists() # 表中存在的主键
  2. obj_list2 = models.Books.objects.filter(pk=10).exists() # 表中不存在的主键
  3. print(obj_list)
  4. print(obj_list2)
  5.  
  6. # 打印内容如下
  7. True
  8. False

first()、last():获取第一个和获取最后一个对象。

  1. obj_list = models.Books.objects.all()
  2.  
  3. print(obj_list.first()) # 获取第一个对象
  4. print(obj_list.last()) # 获取最后一个对象
  5.  
  6. # 打印内容如下
  7. 雪山飞狐 - 40
  8. 水浒传 - 50

上面只显示书籍名字,和价格的原因是。我们在Books表中的显示方式只指定了name和price

count():获取对象个数。

  1. obj_num = models.Books.objects.all().count()
  2. print(obj_num)
  3.  
  4. # 打印内容如下
  5. 6

get(*args, **kwargs):必须给定查找条件,如果不指定查找条件会报错,并且查找条件的匹配结果必须是只有一条记录,如果返回多条记录也会报错,如果查找条件没有匹配的结果也会报错。所以在使用get时必须非常确根据条件肯定能获取到结果,且结果只有一条记录。否则会报错。get是直接返回查找到的记录(也就是类的对象)。

  1. obj = models.Publishing.objects.get(pk=4)
  2. print(obj.name,type(obj))
  3.  
  4. # 打印内容如下
  5. 图灵出版社 <class 'app.models.Publishing'>

参考网址:https://docs.djangoproject.com/en/1.11/ref/models/querysets/

ORM(三)QuerySet查询字段操作的更多相关文章

  1. Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询

    Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...

  2. Django框架详细介绍---ORM相关操作---select_related和prefetch_related函数对 QuerySet 查询的优化

    Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化 引言 在数据库存在外键的其情况下,使用select_related()和pre ...

  3. Django ORM (三) 查询,删除,更新操作

    ORM 查询操作 修改 views.py 文件 from django.shortcuts import render, HttpResponse from app01 import models f ...

  4. QGis(三)查询矢量图层的要素属性字段值(转载)

    QGis(三)查询矢量图层的要素属性字段值 https://github.com/gwaldron/osgearth/issues/489 当加载一个矢量图层后,如果要查看要素的属性字段值,则需要实现 ...

  5. ORM中基于对象查询与基于queryset查询

    感谢老男孩~  一步一步走下去 前面是视图函数 后面是表结构models.py from django.shortcuts import render, HttpResponse from djang ...

  6. ORM基础4 跨表查询+原子性操作

    一.跨表查询 1.# # 正向查找 对象查找 # book_obj = models.Book.objects.get(id=3) # print(book_obj) # ret = book_obj ...

  7. Django ORM中的查询,删除,更新操作

    ORM查询操作 修改views.py文件 from django.shortcuts import render, HttpResponse from app01 import models from ...

  8. python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

    12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...

  9. ORM多表查询下

    一.多表查询 1.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接 ...

随机推荐

  1. Linux 操作系统基础知识

    1.操作系统总体介绍 •CPU: 就像人的大脑,主要负责相关事情的判断以及实际处理的机制.查询指令: cat /proc/cpuinfo•内存: 大脑中的记忆区块,将皮肤.眼睛等所收集到的信息记录起来 ...

  2. BigDecimal.setScale 处理java小数点

    BigDecimal.setScale()方法用于格式化小数点setScale(1)表示保留一位小数,默认用四舍五入方式 setScale(1,BigDecimal.ROUND_DOWN)直接删除多余 ...

  3. HttpClient 专题

    HttpClient is a HTTP/1.1 compliant HTTP agent implementation based on HttpCore. It also provides reu ...

  4. mvn -DskipTests和-Dmaven.test.skip=true区别

    在使用mvn package进行编译.打包时,Maven会执行src/test/java中的JUnit测试用例,有时为了跳过测试,会使用参数-DskipTests和-Dmaven.test.skip= ...

  5. tkinter属性(总结)

    一.主要控件 1.Button 按钮.类似标签,但提供额外的功能,例如鼠标掠过.按下.释放以及键盘操作事件 2.Canvas 画布.提供绘图功能(直线.椭圆.多边形.矩形) 可以包含图形或位图 3.C ...

  6. 巩固java(二)----JVM堆内存结构及垃圾回收机制

    前言:        我们在运行程序时,有时会碰到内存溢出(OutOfMemoryError)的问题,为了解决这种问题,我们有必要了解JVM的内存结构和垃圾回收机制. 正文: 1.JVM堆内存结构   ...

  7. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十五)阶段总结

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 一 每个阶段在结尾时都会有一个阶段总结,在<SSM整合基础篇& ...

  8. Go-技篇第二 命名规范

    优秀的命名 优秀的命名应当是一贯的.短小的.精确的.所谓一贯,就是说同一个意义在不同的环境下的命名应当一致,譬如依赖关系,不要在一个方法中命名为depend,另一个方法中命名为rely.所谓短小,不必 ...

  9. BZOJ_2938_[Poi2000]病毒_AC自动机

    BZOJ_2938_[Poi2000]病毒_AC自动机 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们 ...

  10. 在linux服务器之间复制文件和目录命令scp

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...