• 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!!!
  • 相关阅读:
    Qt相关资料收集
    bakefile初试
    Install VirtualBox 2 Guest Additions in Ubuntu
    Qt使用笔记(2)--Qmake的使用
    英语单词词频
    wxWidgets应用--使用方法与技巧连接收藏
    Learning English
    [转贴]深圳八年职场与人生感言
    帮朋友招聘通信类人才!!!!!
    [新闻]华为发布最高端核心路由器NE5000E集群系统
  • 原文地址:https://www.cnblogs.com/canglongdao/p/14100453.html
Copyright © 2020-2023  润新知