Django-單表查詢

準備知識:__str__  把對象變成字符串。若是想要對象是字符串就去類里加此方法html

queryset是ORM中的類型,而下面查詢返回的queryset類型的數據是咱們看不懂的,所以能夠借用__str__方法看到咱們想要的數據python

 

queryset和model對象的區別:<queryset[model對象,model對象]>linux

    model能夠經過.獲取屬性數據庫

 

一:API查詢

<1> all(): 

做用:查詢全部結果django

調用者:objects管理器  app

返回值:querysetspa

    book_list=Book.objects.all()  #查詢全部表記錄
    # 查詢出來的數據是這樣一種類型QuerySet  相似列表,[obj1,obj2,obj3....]。咱們說的models對象就是這裏的對象
    # book_list[0].title  #獲取屬性值

 

    ret=Book.objects.all()
    print(ret) # <QuerySet [<Book: GO>, <Book: linux>, <Book: 北京摺疊>, <Book: 三體>, <Book: 追風箏的人>, <Book: 亂世佳人>]>
          咱們已經在類裏添加__str__方法,
所以返回的直接是obj.title

 

<2> filter(**kwargs): 

做用:它包含了與所給篩選條件相匹配的對象code

調用者:objects管理器  htm

返回值:queryset對象

ret=Book.objects.filter(title="linux",price=111)
print(ret) # <QuerySet [<Book: linux>]>

<3> get(**kwargs):         

做用:返回與所給篩選條件相匹配的對象,返回結果有且只有一個,若是符合篩選條件的對象超過一個或者沒有都會拋出錯誤。

調用者:objects管理器  

返回值:返回查詢到model對象 (注意:查詢結果有且只有一個才執行)

    ret=Book.objects.get(title="linux")
    print(ret.title) # linux

 

 

<4> exclude(**kwargs):     

做用:它包含了與所給篩選條件不匹配的對象

調用者:objects管理器  

返回值:queryset

查詢全部不等於111的
ret=Book.objects.exclude(price=111)

 

<5> order_by(*field):      

做用:對查詢結果排序

調用者:由queryset對象調用

返回值:queryset  

ret=Book.objects.all().order_by("price")升序
ret=Book.objects.all().order_by("-price","-nid")降序
ret=Book.objects.all().order_by("-price","-nid").first()獲取最大的那個---鏈式操做

 

 

<6> reverse():             

做用:對查詢結果反向排序

調用者:由queryset對象調用

返回值:queryset  

Book.objects.all().order_by("price").reverse()

 

 

<8> count():               

做用:返回數據庫中匹配查詢(QuerySet)的對象數量。

調用者:由queryset對象調用

返回值:返回int

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

 

<9> first():               

做用:返回第一條記錄

調用者:由queryset對象調用

返回值:返回查詢到model對象

fbook=Book.objects.all()[0]
至關於:
fbook=Book.objects.all().first()
# lbook=Book.objects.all().last()

 

<10> last():               

做用:返回最後一條記錄

調用者:由queryset對象調用

返回值:返回查詢到model對象

<11> exists():             

做用:若是QuerySet包含數據,就返回True,不然返回False

調用者:由queryset對象調用

返回值:布爾值

 is_exist=Book.objects.all().exists() #能夠判斷有沒有數據,因此不必查看全部的數據,只要查看第一行是否有數據就行,因此,這裏至關於select * from 表 limint  1
 if is_exist:
    print("OK")

 

<12> values(*field): (重點)  

做用:返回一個ValueQuerySet——一個特殊的QuerySet,運行後獲得的並非一系列model的實例化對象,而是一個可迭代的字典序列

調用者:由queryset對象調用

返回值:queryset

values的源碼相似於下面:

    ret=[]
    for obj in Book.objects.all():
        temp={
           "title":obj.title,
           "price":obj.price
        }
        ret.append(temp)

因此ret裏面是[{"title":obj.title},{}] 列表裏是字典

 

ret=Book.objects.all().values("title","price") # queryset [{"title":"linux"},{"title":"python"},...] 取對應字段的那一列的數據
print(ret) # <QuerySet [{'title': 'GO'}, {'title': 'linux'}, {'title': '北京摺疊'}, {'title': '三體'}, {'title': '追風箏的人'}, {'title': '亂世佳人'}]>
咱們已經在類裏添加__str__方法,所以返回的直接是obj.title

 

 

<13> values_list(*field):  

做用:它與values()很是類似,它返回的是一個元組序列,values返回的是一個字典序列

調用者:由queryset對象調用

返回值:queryset

ret=Book.objects.all().values_list("title","price")
print(ret) # <QuerySet [('GO',), ('linux',), ('北京摺疊',), ('三體',), ('追風箏的人',), ('亂世佳人',)]>   列表裏是元祖

 

<14> distinct():           

做用:從返回結果中剔除重複紀錄

調用者:由queryset對象調用

返回值:queryset

 

ret=Book.objects.all().values("title").distinct()
print(ret)

分析:一張表裏是沒有重複的,由於主鍵id不一樣啊,那distinct存在的意義呢? 咱們能夠結合value,value是獲取某列的數據,這樣不就能夠去重了麼?

 

 

 

二:模糊查詢-基於雙下劃線

 

__isnull:判斷是否爲空

 案例:

1:查詢價格大於200的書籍

ret=Book.objects.filter(price__gt=200)   #大於
ret=Book.objects.filter(price__gte=200) #大於等於

 

2: 查詢書籍名稱以py開頭的全部的書籍的名稱

ret=Book.objects.filter(title__startswith="py").values("title")
ret=Book.objects.filter(title__istartswith="py").values("title")
ret=Book.objects.filter(title__contains="p").values("title")#包含p的全部書籍
print(ret) # <QuerySet [{'title': 'pycharm'}, {'title': 'python'}]>

__startswith和__istartswith的區別__istartswith不區分大小寫

3:查詢2017年7月份的全部的書籍

ret=Book.objects.filter(pub_date__year=2017,pub_date__month=7)
print(ret) #  <QuerySet []>

其餘案例:

1 查詢蘋果出版社出版過的價格大於200的書籍
Book.objects.filter(publish="蘋果出版社",price__gt=200)

2 查詢2017年8月出版的全部以py開頭的書籍名稱
Book.objects.filter(pub_date__year=2017,pub_date__month=8,title__startswith="py")

3 查詢價格爲50,100或者150的全部書籍名稱及其出版社名稱
Book.objects.filter(price__in=[50,100,150]).values("title","publish")
# [{},{}]

4 查詢價格在100到200之間的全部書籍名稱及其價格
Book.objects.filter(price__range=[100,200]).values("title","price")

5 查詢全部人民出版社出版的書籍的價格(從高到低排序,去重)
Book.objects.filter(publish="人民出版社").order_by("-prcie").values("price").distinct() 
[obj3,obj1,obj2]----->[{"prcie":200},{"prcie":100}]

 


 

參考:官方文檔

相關文章
相關標籤/搜索