1. 程式人生 > >django中常用的資料查詢方法

django中常用的資料查詢方法

5.2 資料查詢

要從資料庫檢索資料,首先要獲取一個*查詢集***(QuerySet),查詢集表示從資料庫獲取的物件集合,它可以有零個,一個或多個過濾器。返回查詢集的方法,稱為過濾器,過濾器根據給定的引數縮小查詢結果範圍,相當於sql語句中where或limit。

  • 在管理器上呼叫過濾器方法會返回查詢集
  • 查詢集經過過濾器篩選後返回新的查詢集,因此可以寫成鏈式過濾
  • 惰性執行:建立查詢集不會帶來任何資料庫的訪問,直到呼叫資料時,才會訪問資料庫
  • 以下對查詢集求值:迭代、切片、序列化、與if合用、repr()/print()/len()/list()/bool()
  管理器的方法 返回型別 說明
模型類.objects.all() QuerySet 返回表中所有資料
模型類.objects.filter() QuerySet 返回符合條件的資料
模型類.objects.exclude() QuerySet 返回不符合條件的資料
模型類.objects.order_by() QuerySet 對查詢結果集進行排序
模型類.objects.values() QuerySet 返回一個列表 每個元素為一個字典
模型類.objects.reverse() QuerySet 對排序的結果反轉
模型類.objects.get() 模型物件 返回一個滿足條件的物件;
如果沒有找到符合條件的物件,會引發模型類.DoesNotExist異常;
如果找到多個,會引發模型類.MultiObjectsReturned 異常
模型類.objects.count() int 返回查詢集中物件的數目
模型類.objects.first() 模型物件 返回第一條資料
模型類.objects.last() 模型物件 返回最後一條資料
模型類.objects.exists() bool 判斷查詢的資料是否存在

5.2.1 返回查詢集

  • all()

    # 獲取所有資料,對應SQL:select * from User
    User.objects.all()
    
  • filter(**kwargs) 返回QuerySet包含與給定查詢引數匹配的新查詢集。

    #等價sql:select * from User
    User.objects.filter()
    
    #等價sql:select * from User where uname = 'admin'
    User.objects.filter(uname='admin')
    
    #等級sql:select * from User where uid > 1 and type = 2
    User.objects.filter(uid__gt=1,type=2)
    
    #鏈式呼叫,等價於User.objects.filter(uid__gt=1,type=2)
    User.objects.filter(uid__gt=1).filter(type=2)
    
  • exclude(**kwargs)

    # 不匹配,對應SQL:select * from User where name != 'admin'
    User.objects.exclude(name='admin')
    
  • order_by(*fields)

    • 引數是欄位名,可以有多個欄位名,預設是升序。
    • 如果要按某個欄位降序,在欄位名前加’-’: "-uid"表示按uid降序排列
  #按uid升序排列  等價於 order by uid
  User.objects().order_by('uid')

  #按uid降序排列  等價於 order by uid desc
  User.objects.order_by('-uid')

  #多列排序 等價於 order by password,uid desc
  User.objects.order_by('password','-uid')
  • values()

    #返回所有欄位
    User.objects.values()
    #返回資料:
    [{'uid': 2, 'uname': '小甜甜', 'password': '59f2443a4317918ce29ad28a14e1bdb7'type': '普通使用者', 'regtime': None, 'ip': None, 'allowed': '允許登入', 'email': None, None},...]
     
    #返回指定欄位
    User.objects.values('uname','password')
    [{'uname': '小甜甜', 'password': '59f2443a4317918ce29ad28a14e1bdb7'},...]
    
  • reverse()

    User.objects.order_by('id').reverse()  降序
    User.objects.order_by('-id').reverse()  升序
    
  • distinct() 去重

    User.objects.values('password').distinct()
    

5.2.2 返回單個值

下面這些方法後面不能再跟其他過濾方法,因為他們不返回查詢集

  • get() 只匹配一條資料

    u = User.objects.get(pk=1)  #正常
    u = User.objects.get(uid__gt=20) #MultipleObjectsReturned 匹配到了多條資料
    u = User.objects.get(uid__lt=-1) #DoesNotExist 匹配失敗
    
  • first()和last()

    User.objects.all().first()  #返回結果集中第一條資料
    User.objects.all().last()   #返回結果集中最後一條資料
    
  • count()

    • 返回結果集記錄數目,等價於select count(*)
    • 不會返回整個結果集,相比len方法更有效
    User.objects.count()
    
  • exists()

    • 判斷查詢集中是否有記錄,有返回True,否則返回False

      User.objects.filter(uid=3).exists()
      

5.2.3查詢集限制

查詢集類似列表,可以使用下標進行限制,類似sql語句中的limit子句。但索引不能是負數

  • 索引
  • 切片
User.objects.all()[0]  #等同於:limit 0,1
User.objects.all()[2]  #等同於:limit 2,1
User.objects.all()[0:2] #等同於limit 2
User.objects.all()[:2] #等同於limit 2
User.objects.all()[::2]