python测试开发django(12)--ORM查询表结果

前言

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

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

数据准备

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

 可迭代对象queryset

查询整张表sql:select * from xjyn_users

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

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

testdb.py内容如下;

#testdb.py
from django.http import HttpResponse
from xjyn.models import Users

def sel_all(request):
    names=""
    pwds=""
    mails=""
    r=Users.objects.all()

    for i in r:
        names+=" "+i.user_name
        pwds+=" "+i.pwd
        mails+=" "+i.mail
    return HttpResponse('''<p>查询username结果:{},
                        <p>查询pwd结果:{},
                        <p>查询mail结果:{}
    '''.format(names,pwds,mails))

 urls.py内容如下;

#helloworld/helloworld/urls.py
from django.conf.urls import url
from . import testdb

urlpatterns=[
   url('^$',testdb.sel_all),
]

 浏览器访问:http://127.0.0.1:8000/,结果如下:

 

 筛选条件filter()

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

select * from xjyn_users where user_name="hui6" and pwd="333"

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

testdb.py中新增内容如下;

def sel_filter(request):
    r=""
    result=Users.objects.filter(user_name="hui6",
                                pwd="333")
    try:
        r=result[0].mail
    except:
        r="null"
    return HttpResponse("<p>查询mail结果:{}</p>".format(r))

 在urls.py配置访问地址

url('^selectf$',testdb.sel_filter),访问后得到的结果:查询mail结果:123456@qq.com

 可迭代的字典序列values()

all()和filter()返回的都是可迭代的queryset序列,平常我们习惯取字典的对象,可以用values()方法获取Users.objects.all().values("user_name","mail")类似于SQL语句

select user_name,pwd from xjyn_users

testdb.py中新增内容:

def sel_values(request):
    r=""
    result=Users.objects.all().values("user_name","mail")
    for i in result:
        r+=str(i)
    return HttpResponse('<p>查询结果:{}</p>'.format(r))

 在urls.py配置访问地址

url('^sel_v$',testdb.sel_values),访问后得到的结果: 

查询结果:{'user_name': 'hui6', 'mail': '123456@qq.com'}{'user_name': 'he', 'mail': '3'}{'user_name': 'gun', 'mail': '7'}  

其它可迭代对象

  • exclude() 它包含了与所给筛选条件不匹配的对象  调用者:objects管理器 返回queryset
查找用户名不是"hui6"的数据
et=Users.objects.exclude(user_name="hui6")
  •  order_by() 对查询结果排序 由queryset对象调用,返回值是queryset

 

查询所有的数据,按mail字段排序,默认升序
result=Users.Objects.all().order_by("mail")
查询所有的数据,按mail字段排序,前面加个-是代表降序
result=Users.Objects.all().order_by("-mail")

 如果有“-”则代表降序,没有则默认升序

  • reverse()对查询结果反向排序 由queryset对象调用,返回值是queryset
查询所有的数据,按mail字段排序,默认升序,查询结果反向排序,功能跟-mail一样
result=Users.objects.all().order_by("mail").reverse()
  • values_list()由queryset对象调用,返回值是queryset一个元组序列
和values差不多,只是这里返回的是元组
result=Users.objects.all().values_list("user_name","mail")
  • distinct() 从返回结果中剔除重复记录 由queryset对象调用,返回值是queryset
和sql里面的distinct去重一样
result=Users.objects.all().values("user_name","mail").distinct()

 get()返回单个对象

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

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

def sel_get(request):
    r=""
    re=Users.objects.get(mail="7")
    r=re.user_name+re.pwd
    return HttpResponse('<p>查询结果:{}</p>'.format(r))

 在urls.py配置访问地址  url('^selget$',testdb.sel_get),访问后得到的结果:查询结果:gun111

first() 和last()

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

def sel_first(request):
    rs=Users.objects.all().order_by("pwd")[0].mail
    re=Users.objects.all().order_by("pwd").first()
    r=re.mail
    rel = Users.objects.all().order_by("pwd").last()
    rl = rel.mail
    return HttpResponse('查询rs结果:{},first结果:{},last结果:{}'.format(rs,r,rl))

 在urls.py中配置访问地址  

url('^self$',testdb.sel_first),访问结果如下图

 exists()和count()

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

exists:由queryset对象调用 返回值布尔值
is_exist=Users.objects.all().exists()

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

count:数数 ;由queryset对象调用,返回int
ret=Users.objects.all().count()

  

越努力,越幸运!!! good good study,day day up!!!
原文地址:https://www.cnblogs.com/canglongdao/p/14100453.html