python測試開發django-14.ORM查詢表結果(超詳細)


前言

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM