準備知識:__str__ 把對象變成字符串。若是想要對象是字符串就去類里加此方法html
queryset是ORM中的類型,而下面查詢返回的queryset類型的數據是咱們看不懂的,所以能夠借用__str__方法看到咱們想要的數據python
queryset和model對象的區別:<queryset[model對象,model對象]>linux
model能夠經過.獲取屬性數據庫
做用:查詢全部結果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
做用:它包含了與所給篩選條件相匹配的對象code
調用者:objects管理器 htm
返回值:queryset對象
ret=Book.objects.filter(title="linux",price=111) print(ret) # <QuerySet [<Book: linux>]>
做用:返回與所給篩選條件相匹配的對象,返回結果有且只有一個,若是符合篩選條件的對象超過一個或者沒有都會拋出錯誤。
調用者:objects管理器
返回值:返回查詢到model對象 (注意:查詢結果有且只有一個才執行)
ret=Book.objects.get(title="linux") print(ret.title) # linux
做用:它包含了與所給篩選條件不匹配的對象
調用者:objects管理器
返回值:queryset
查詢全部不等於111的
ret=Book.objects.exclude(price=111)
做用:對查詢結果排序
調用者:由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()獲取最大的那個---鏈式操做
做用:對查詢結果反向排序
調用者:由queryset對象調用
返回值:queryset
Book.objects.all().order_by("price").reverse()
做用:返回數據庫中匹配查詢(QuerySet)的對象數量。
調用者:由queryset對象調用
返回值:返回int
ret=Book.objects.all().count()
做用:返回第一條記錄
調用者:由queryset對象調用
返回值:返回查詢到model對象
fbook=Book.objects.all()[0] 至關於: fbook=Book.objects.all().first() # lbook=Book.objects.all().last()
做用:返回最後一條記錄
調用者:由queryset對象調用
返回值:返回查詢到model對象
做用:若是QuerySet包含數據,就返回True,不然返回False
調用者:由queryset對象調用
返回值:布爾值
is_exist=Book.objects.all().exists() #能夠判斷有沒有數據,因此不必查看全部的數據,只要查看第一行是否有數據就行,因此,這裏至關於select * from 表 limint 1 if is_exist: print("OK")
做用:返回一個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
做用:它與values()很是類似,它返回的是一個元組序列,values返回的是一個字典序列
調用者:由queryset對象調用
返回值:queryset
ret=Book.objects.all().values_list("title","price") print(ret) # <QuerySet [('GO',), ('linux',), ('北京摺疊',), ('三體',), ('追風箏的人',), ('亂世佳人',)]> 列表裏是元祖
做用:從返回結果中剔除重複紀錄
調用者:由queryset對象調用
返回值:queryset
ret=Book.objects.all().values("title").distinct() print(ret) 分析:一張表裏是沒有重複的,由於主鍵id不一樣啊,那distinct存在的意義呢? 咱們能夠結合value,value是獲取某列的數據,這樣不就能夠去重了麼?
__isnull:判斷是否爲空
ret=Book.objects.filter(price__gt=200) #大於 ret=Book.objects.filter(price__gte=200) #大於等於
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不區分大小寫
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}]
參考:官方文檔