前言

django查询数据库的方法很多,不同的方法返回的结果也不太一样,本篇详细讲解关于查询的13个方法

  • 返回对象是对象列表的: all(), filter(), exclude(), order_by(), reverse(), values(), values_list(), distinct()
  • 返回结果是对象: get(), first(), last()
  • 返回结果是布尔值: exists()
  • 返回数字: count()

数据准备

接着前面的User表,测试数据如下

user_name psw mail
yoyo 123456 283340479@qq.com
yoyo2 111111 1
yoyo5 111111 0

可迭代对象queryset

查询整张表sql : select * from hello_user

django里面查询数据库不需要写sql语句 ret=表的类名称.objects.all() 返回的是整个表的内容, 这里返回的是可迭代对象queryset,并没直接返回全部数据

如果想取出数据,需要用到for循环读取

from django.http import HttpResponse
from hello.models import User def slec_all(request):
‘’‘取出User表里面user_name 、psw 、mail全部数据’‘’
users = ""
psws = ""
mails = ""
ret = User.objects.all() # 返回queryset对象,可迭代
for i in ret:
users += " " + i.user_name # 获取user_name字段
psws += " " + i.psw # 获取psw字段
mails += " " + i.mail # 获取mail字段 return HttpResponse('''<p>查询user结果:%s</p>
<p>查询psw结果:%s</p>
<p>查询psw结果:%s</p>''' % (users, psws, mails))

在urls.py配置访问地址 url(r'^slec_all$', testdb.slec_all),访问后得到的结果

查询user结果: yoyo yoyo2 yoyo5

查询psw结果: 123456 111111 111111

查询psw结果: 283340479@qq.com 1 0

筛选条件filter()

查询的时候添加删除条件,类似于SQL里面的where语句

select * from hello_user where user_name = "yoyo" and psw ="123456"

filter()查询的结果是可迭代对象,如果结果只有一个,可以通过下标取值。找不到的时候给个默认值null

from django.http import HttpResponse
from hello.models import User def sele_filter(request):
'''获取user_name="yoyo" and psw="123456"对应的mail值
查找为空时,返回null'''
r = ""
ret = User.objects.filter(user_name="yoyo",
psw="123456")
try:
r = ret[0].mail
except:
r = "null"
return HttpResponse('<p>查询结果:%s</p>'%r)

在urls.py配置访问地址 url(r'^sele_filter$', testdb.sele_filter),访问后得到的结果: 查询结果:283340479@qq.com

可迭代的字典序列values()

all()和filter()返回的都是可迭代的queryset序列,平常我们习惯获取字典的对象,可以用values()方法获取

User.objects.all().values("user_name", "mail") 类似于SQL语句

select user_name, psw from hello_user

def sele_values(request):
'''可迭代的字典序列'''
r = ""
ret = User.objects.all().values("user_name", "mail")
for i in ret:
r += str(i)
return HttpResponse('<p>查询结果:%s</p>'%r)

在urls.py配置访问地址 url(r'^sele_values$', testdb.sele_values),访问后得到的结果

查询结果:{'user_name': 'yoyo', 'mail': '283340479@qq.com'}{'user_name': 'yoyo2', 'mail': '1'}{'user_name': 'yoyo5', 'mail': '0'}

其它可迭代对象

  • exclude() 它包含了与所给筛选条件不匹配的对象 调用者:objects管理器 返回queryset

查找用户名不是"yoyo"的数据

et=User.objects.exclude(user_name="yoyo")

  • order_by() 对查询结果排序 由queryset对象调用,返回值是queryset

查询所有的数据,按mail字段排序,默认升序

ret=User.objects.all().order_by("mail")

查询所有的数据,按mail字段排序,前面加个-是代表降序

ret=User.objects.all().order_by("-mail")

如果有‘-’则代表着降序,没有则默认升序

  • reverse() 对查询结果反向排序 由queryset对象调用,返回值是queryset

查询所有的数据,按mail字段排序,默认升序,查询结果反向排序,功能跟-mail一样

ret=User.objects.all().order_by("mail").reverse()

  • values_list() 由queryset对象调用, 返回值是queryset 一个元组序列

和values差不多,只是这里返回的是元组

ret=User.objects.all().values_list("user_name", "mail")

  • distinct() 从返回结果中剔除重复纪录 由queryset对象调用,返回值是queryset

和sql里面的distinct去重一样

ret=User.objects.all().values("user_name", "mail").distinct()

get()返回单个对象

django的get是从数据库的取得唯一个匹配的结果,返回一个对象。调用者:objects管理器 返回查询到model对象 (注意:查询结果有且只有一个才执行)

如果查询结果有多个,会报错MultipleObjectsReturned, 如果查询结果有0个,会报错DoesNotExist

from django.http import HttpResponse
from hello.models import User def sele_get(request):
'''get返回唯一的查询结果'''
r = ""
ret = User.objects.get(user_name="yoyo")
r = ret.user_name + ret.mail
return HttpResponse('<p>查询结果:%s</p>'%r)

在urls.py配置访问地址 url(r'^sele_get$', testdb.sele_get),访问后得到的结果

查询结果:yoyo283340479@qq.com

first()和last()

first(),last()方法: 返回第一条记录和返回最后一条记录 调用者:queryset 返回model对象

from django.http import HttpResponse
from hello.models import User def sele_first_last(request):
'''查询第一个和最后一个记录'''
# fir = User.objects.all().order_by("mail")[0]
fir = User.objects.all().order_by("mail").first()
f = fir.mail las = User.objects.all().order_by("mail").last()
l = las.mail
return HttpResponse('<p>查询第一个结果:%s</p> <p>查询最后结果:%s</p>' % (f, l))

在urls.py配置访问地址 url(r'^sele_first_last$', testdb.sele_first_last),访问后得到的结果

查询第一个结果:0

查询最后结果:283340479@qq.com

exists()和count()

exists() 如果QuerySet包含数据,就返回True,否则返回False 由queryset对象调用 返回值布尔值

exists: 由queryset对象调用 返回值布尔值

is_exist=User.objects.all().exists()

count : 数数 由queryset对象调用 返回int

count :数数 :由queryset对象调用 返回int

ret=User.objects.all().count()

django交流QQ群:779429633

python测试开发django-14.查询表结果(超详细)的更多相关文章

  1. python测试开发django-36.一对一(OneToOneField)关系查询

    前言 前面一篇在xadmin后台一个页面显示2个关联表(OneToOneField)的字段,使用inlines内联显示.本篇继续学习一对一(OneToOneField)关系的查询. 上一篇list_d ...

  2. python测试开发django-16.JsonResponse返回中文编码问题

    前言 django查询到的结果,用JsonResponse返回在页面上显示类似于\u4e2d\u6587 ,注意这个不叫乱码,这个是unicode编码,python3默认返回的编码 遇到问题 接着前面 ...

  3. python测试开发django-15.查询结果转json(serializers)

    前言 django查询数据库返回的是可迭代的queryset序列,如果不太习惯这种数据的话,可以用serializers方法转成json数据,更直观 返回json数据,需要用到JsonResponse ...

  4. 2019第一期《python测试开发》课程,10月13号开学

    2019第一期<python测试开发>课程,10月13号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:10月13号-12月8号,每周六.周日晚上20: ...

  5. python测试开发django-rest-framework-63.基于函数的视图(@api_view())

    前言 上一篇讲了基于类的视图,在REST framework中,你也可以使用常规的基于函数的视图.它提供了一组简单的装饰器,用来包装你的视图函数, 以确保视图函数会收到Request(而不是Djang ...

  6. 《Python测试开发技术栈—巴哥职场进化记》—前言

    写在前面 今年从4月份开始写一本讲Python测试开发技术栈的书,主要有两个目的,第一是将自己掌握的一些内容分享给大家,第二是希望自己能系统的梳理和学习Python相关的技术栈.当时我本来打算以故事体 ...

  7. python测试开发django-197.django-celery-beat 定时任务

    前言 django-celery-beat 可以支持定时任务,把定时任务写到数据库. 接着前面这篇写python测试开发django-196.python3.8+django2+celery5.2.7 ...

  8. python测试开发django-41.crispy-forms设计标签式导航菜单(TabHolder)

    前言 xadmin的详情页面主要是用form_layout布局,学会了完全可以不用写html代码,也能做出很好看的页面. xadmin的html页面是用的Bootstrap3框架设计的,layout布 ...

  9. 【python测试开发栈】python基础语法大盘点

    周边很多同学在用python,但是偶尔会发现有人对python的基础语法还不是特别了解,所以帮大家梳理了python的基础语法(文中的介绍以python3为例).如果你已然是python大牛,可以跳过 ...

  10. python web开发——django学习(一)第一个连接mysql数据库django网站运行成功

    1.新建一个项目 2.新建一些文件夹方便管理 3.新建一个项目叫message  4.连接数据库 python web开发Django连接mysql 5.在数据库里自动生成django的表  6.运行 ...

随机推荐

  1. K-means聚类算法的三种改进(K-means++,ISODATA,Kernel K-means)介绍与对比

      一.概述 在本篇文章中将对四种聚类算法(K-means,K-means++,ISODATA和Kernel K-means)进行详细介绍,并利用数据集来真实地反映这四种算法之间的区别. 首先需要明确 ...

  2. 【linux】监控磁盘情况并自动删除备份文件

    背景:我有一个备份目录/home/kzy/bakup,会每天备份一些信息.随着日子一天天的过去,这个文件夹越来越大,终于把磁盘撑满了..... 需求:当磁盘占有率超过80%时自动删除该文件夹下最老的3 ...

  3. js时间格式化函数(兼容IOS)

    * 时间格式化 * @param {Object} dateObj 时间对象 * @param {String} fmt 格式化字符串 */ dateFormat(dateObj, fmt) { le ...

  4. java安装1.8的经验和Error: Registry key 'Software\JavaSoft\Java Runtime Environment'\CurrentVers问题处理

            java安装1.8后的问题:之前安装了jdk1.7和jdk1.6,之后又安装jdk1.8,然后执行java -version,输出的是1.8的,后来在注册表把jdk1.8改为1.7,然 ...

  5. Storm集群启动流程分析

    Storm集群启动流程分析 程序员 1.客户端运行storm nimbus时,会调用storm的python脚本,该脚本中为每个命令编写了一个方法,每个方法都可以生成一条相应的Java命令. 命令格式 ...

  6. HTML5 标签语法变化和使用概念

    1.H5与H4的区别 概念的变化: H5更注重内容与结构,不再只专注于表现. 声明与标签: 新的声明背简化: <!DOCTYPE html> <meta charset=utf-8& ...

  7. js上传插件uploadify自动检测不到flash控件的问题

    [问题描述] 项目开发中,由于使用了js的一个上传插件uploadify,下载的是flash版本的,后来在谷歌浏览器上运行时经常报flash控件未安装,虽然下图是uploadify自动检测自动弹出来的 ...

  8. django URLconf调度程序

    路由的编写方式是Django2.0和1.11最大的区别所在,Django官方迫于压力和同行的影响,不得不将原来的正则匹配表达式,改为更加简单的path表达式,但依然通过re_path()方法保持对1. ...

  9. 用scrapy爬取京东的数据

    本文目的是使用scrapy爬取京东上所有的手机数据,并将数据保存到MongoDB中. 一.项目介绍 主要目标 1.使用scrapy爬取京东上所有的手机数据 2.将爬取的数据存储到MongoDB 环境 ...

  10. 3,EasyNetQ-发布/订阅

    一.发布 在发布/订阅模式中的角色是彼此陌生的. 一个发布者只是向世界说这个已经发生了,一位订阅者告诉世界“我在乎这个”. 在这个模型中,没有人关心特定的事件是很好的. 消息可能有一个订阅者,可能有2 ...