八 Django-基本查詢操作

數(shù)據(jù)庫基本操作(查詢)

一规辱、查詢對象

從數(shù)據(jù)庫里檢索對象谆棺,可以通過模型的Manage來建立QuerySet,一個QuerySet表現(xiàn)為一個數(shù)據(jù)庫中對象的結(jié)合,他可以有0個一個或多個過濾條件,在SQL里QuerySet相當(dāng)于select語句用where或limit過濾改淑。你通過模型的Manage來獲取QuerySet碍岔,每個模型至少有一個Manage

注:Managers只可以通過模型的類訪問,而不可以通過模型的實例訪問朵夏,目的是為了強制區(qū)分“表級別”的操作和“記錄級別”的操作

二蔼啦、返回QuerySet對象

要檢索數(shù)據(jù)庫中的對象,就要為你的model 類構(gòu)造一個查詢集QuerySet仰猖。一個QuerySet就代表數(shù)據(jù)庫中的一組數(shù)據(jù)捏肢。它可以有一個或很多個,也可以通過filter根據(jù)給定的參數(shù)對數(shù)據(jù)集做進一步篩選饥侵。在SQL術(shù)語中鸵赫,QuerySet相當(dāng)于SELECT語句,filter相當(dāng)于WHERE或LIMIT這樣的限定從句

為什么要使用QuerySet對象,主要是他包含兩個比較重要的特性

  • 惰性機制
  • 緩存機制

query_set緩存機制1次數(shù)據(jù)庫查詢結(jié)果query_set都會對應(yīng)一塊緩存躏升,再次使用該query_set時辩棒,不會發(fā)生新的SQL操作;這樣減小了頻繁操作數(shù)據(jù)庫給數(shù)據(jù)庫帶來的壓力

1膨疏、all

  1. 方法

    all()[]
    
  2. 說明

    查詢所有信息 支持切片操作,切片只支持正整數(shù),索引從0開始

  3. 示例代碼

    #  不觸發(fā)數(shù)據(jù)庫操作
    users = UserInfo.objects.all()
    for user in users:
      # 觸發(fā)數(shù)據(jù)庫操作
      print(user.username)
    # 切片操作 觸發(fā)數(shù)據(jù)庫操作
    # 獲取第11條數(shù)據(jù)
    users = UserInfo.objects.all()[10]
    # 獲取前5條數(shù)據(jù)
    users = UserInfo.objects.all()[0:5]
    # 獲取第1條到第10條數(shù)據(jù)
    users = UserInfo.objects.all()[1:10]
    
    users = UserInfo.objects.all()[0:10:2]
    

2一睁、filter

  1. 方法

    filter(**kwargs)
    
  2. 說明

    返回一個QuerySet,包含滿足查詢參數(shù)的對象

  3. 參數(shù)

    • **kwargs

      查詢的參數(shù),where后面的條件

  4. 示例代碼

    UserInfo.objects.filter(username='小明')
    

3成肘、exclude()

  1. 方法

    exclude(**kwargs)
    
  2. 說明

    反向查詢卖局,指返回查詢條件相反的對象

  3. 參數(shù)

    • **kwargs

      查詢的參數(shù),where后面的條件

  4. 示例代碼

    UserInfo.objects.exclude(username='小明')
    

4、order_by()

  1. 方法

    order_by(**kwargs)
    
  2. 說明

    對結(jié)果集進行升序或降序双霍,可指定需要排序的字段砚偶。

  3. 參數(shù)f

    • **kwargs

      查詢的參數(shù),order by后面的字段

  4. 示例代碼

    # 升序
    UserInfo.objects.filter().order_by('create_date')
    # 降序
    UserInfo.objects.filter().order_by('-create_date')
    # 隨機排序(開發(fā)中不要使用)
    UserInfo.objects.order_by('?create_date')
    

5、values()

  1. 方法

    values(**kwargs,**expressions)
    
  2. 說明

    • 當(dāng)作為迭代器使用時洒闸,返回一個返回字典染坯,而不是模型實例。
    • 該values()方法采用可選的位置參數(shù)丘逸,*fields它指定SELECT應(yīng)限制的字段名稱单鹿。如果指定了字段,每個字典將僅包含指定字段的字段鍵/值深纲。如果不指定字段仲锄,則每個字典將包含數(shù)據(jù)庫表中每個字段的鍵和值
    • 該values()方法還包含可選的關(guān)鍵字參數(shù) **expressions
  3. 參數(shù)

    • **kwargs

      過濾的列

    • **expressions

      關(guān)鍵字參數(shù) 例如常見的:Lower(值轉(zhuǎn)化成小寫), Upper(值轉(zhuǎn)化成大寫), Length(計算值的長度)

  4. 示例代碼

    UserInfo.objects.all().values()
    #指定字典
    UserInfo.objects.all().values('username')
    # 可選關(guān)鍵字 
    from django.db.models.functions import Lower, Upper, Length
    objects.values(lower=Lower('username'))
    objects.values(lower=Upper('username'))
    objects.values(lower=length('username'))
    

6、values_list()

  1. 方法

    values_list(*fields,flat=False)
    
  2. 說明

    返回列表湃鹊,每個元組都包含傳入values_list()調(diào)用的相應(yīng)字段或表達式的值儒喊,

  3. 參數(shù)

    • *fields

      過濾在的字段

    • flat

      bool類型,默認是False,

      如果只傳入單個字段,則還可以傳入 flat 參數(shù)設(shè)置為True币呵,這將意味著返回的結(jié)果是單值怀愧,而不是一元組。

  4. 示例代碼

    # 查詢所有字段的值
    users = UserInfo.objects.all().values_list()
    # 查詢單值字段的值
    users = UserInfo.objects.values_list('username', flat=True)
    # 查詢指定字段的值
    users = UserInfo.objects.values_list('uid', 'username')
    # 如果想查詢單條記錄可以
    users = UserInfo.objects.values_list('uid', 'username').first()
    # 或者
    users = UserInfo.objects.values_list('uid', 'username').get(pk=1)
    

7、raw()

  1. 方法

    raw(str)
    
  2. 說明

    在模型查詢API不夠用的情況下芯义,你可以使用原始的SQL語句哈垢。Django提供兩種方法使用原始SQL進行查詢:一種是使用Manager.raw()方法,進行原始查詢并返回模型實例扛拨;另一種是完全避開模型層耘分,直接執(zhí)行自定義的SQL語句。

    raw()接受一個原始的SQL查詢鬼癣,執(zhí)行它并返回一個 django.db.models.query.RawQuerySet實例陶贼。這個RawQuerySet實例可以像正常一樣迭代QuerySet以提供對象實例。

  3. 參數(shù)說明

    • str

      原生sql語句

  4. 示例代碼

    raw = UserInfo.objects.raw(
        'select * from UserInfo where username = '%s' ORDER BY id desc' % name)
    #通過raw方法查詢的結(jié)果是一個RawQuerySet對象待秃,如果想取到所有的值
    raw[0].__dict__ 
    #可以封裝成方法
    def Serialization(objects) :
        '''
        _obj: objext -> list, Python 3.6新加入的特性, 用來標(biāo)識這個方法接收一個對象并返回一個list
        orm.raw序列化
        '''
        _list = []
        _get = []
        for i in objects:
            _list.append(i.__dict__)
    
        for i in _list:
            del i['_state']
            _get.append(i)
        return _get
    

8、鏈式查詢

  1. 說明

    類似jQuery的鏈式編程

  2. 示例代碼

    users = UserInfo.objects.filter(username='test2').exclude(is_delete=True).filter(create_date=date(2018, 7, 5))
    # 等同
    # qt = UserInfo.objects.filter(username='test2')
    # qt = qt.exclude(is_delete=True)
    # qt = qt.filter(create_date=date(2018, 7, 5))
    

11痹屹、Q()

  1. 說明

    Q對象(django.db.models.Q)可以對關(guān)鍵字參數(shù)進行封裝章郁,從而更好地應(yīng)用多個查詢≈狙埽可以組合使用 &(and),|(or)暖庄,~(not)操作符,當(dāng)一個操作符是用于兩個Q的對象,它產(chǎn)生一個新的Q對象

    每個接受關(guān)鍵字參數(shù)的查詢函數(shù)(例如filter()楼肪、exclude()培廓、get())都可以傳遞一個或多個Q 對象作為位置(不帶名的)參數(shù)。如果一個查詢函數(shù)有多個Q 對象參數(shù)春叫,這些參數(shù)的邏輯關(guān)系為“AND"

    注意:一定要把Q對象放在關(guān)鍵字參數(shù)查詢的前面

  2. 示例代碼

    # 查詢 注冊日期是2016-10-2 或者 2016-10-6日的所有用戶信息
    users= UserInfo.objects.filter(
        Q(create_time=date(2016, 10, 2)) | Q(create_time=date(2016, 10, 6))
    )
    
    # 查詢 用戶名是xiaohong 和 沒有注銷的用戶信息
    users= UserInfo.objects.filter(
        Q(username='xiaohong') & Q(is_delete=False)
    )
    

12肩钠、F()

  1. 說明

    允許Django在未實際鏈接數(shù)據(jù)的情況下具有對數(shù)據(jù)庫字段的值的引用。通常情況下我們在更新數(shù)據(jù)時需要先從數(shù)據(jù)庫里將原數(shù)據(jù)取出后方在內(nèi)存里暂殖,然后編輯某些屬性价匠,最后提交。F對象支持四則運算

  2. 示例代碼

     # from django.db.models import F
     UserInfo.objects.update(num=F('num')+1)
    

三呛每、不返回QuerySet對象

QuerySet方法結(jié)果集不返回QuerySet踩窖。這些方法不使用緩存。相反晨横,他們每次查詢都會調(diào)用數(shù)據(jù)庫洋腮。

1、get()

  1. 方法

    get(**kwargs)
    
  2. 說明

    返回匹配給定查找參數(shù)的對象手形,該參數(shù)應(yīng)采用字段查找中描述的格式

    如果沒有找到給定參數(shù)的對象啥供,則引發(fā)DoesNotExist異常。

    如果沒有找多個給定參數(shù)的對象叁幢,則引發(fā)MultipleObjectsReturned異常滤灯。

  3. 參數(shù)說明

    **kwargs: 查詢的參數(shù)

  4. 返回值

    模型對象

  5. 示例代碼

    user = UserInfo.objects.get(uid=1)
    UserInfo.objects.get(id=1, username='xiaoming')
    

3、count()

  1. 方法

    count()
    
  2. 說明

    返回總條數(shù)

  3. 參數(shù)說明

  4. 返回值

    整形

  5. 示例代碼

    UserInfo.objects.count()
    UserInfo.objects.filter(uid gt =1).count()
    

4、last()

  1. 說明

    獲取最后最后一條數(shù)據(jù)

5鳞骤、first()

  1. 說明

    獲取第一條數(shù)據(jù)

6窒百、annotate()

  1. 方法

    annotate(*args,**kwargs)
    
  2. 說明

    分組函數(shù),用于實現(xiàn)聚合group by查詢 前面的values寫的是誰,就group誰

  3. 參數(shù)說明

  4. 返回值

    通過計算得到的聚合值的字典

  5. 示例代碼

    from django.db.models import Avg, Min, Max, Count, Sum
    # 按性別統(tǒng)計用戶的總數(shù)
    #  SELECT `sex`, COUNT('count') AS `uid` FROM `user` GROUP BY `sex`,
    users = UserInfo.objects.values('sex').annotate(uid=Count('uid'))
    # SELECT `user`.`sex`, COUNT(`user`.`uid`) AS `uid`, AVG(`user`.`age`) AS `ages` FROM `user` GROUP BY `user`.`sex`,
    users = UserInfo.objects.values('sex').annotate(uid=Count('uid'), ages=Avg('age'))
    

7豫尽、aggregate()

  1. 方法

    aggregate(*args, **kwargs)
    
  2. 說明

    聚合函數(shù)

  3. 參數(shù)說明

    • Avg,
    • Min,
    • Max,
    • Count,
    • Sum
  4. 返回值

    通過計算得到的聚合值的字典

  5. 示例代碼

    from django.db.models import Avg, Min, Max, Count, Sum
    users = UserInfo.objects.aggregate(uid=Count('uid'))
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末篙梢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子美旧,更是在濱河造成了極大的恐慌渤滞,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榴嗅,死亡現(xiàn)場離奇詭異妄呕,居然都是意外死亡,警方通過查閱死者的電腦和手機嗽测,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門绪励,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人唠粥,你說我怎么就攤上這事疏魏。” “怎么了晤愧?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵大莫,是天一觀的道長。 經(jīng)常有香客問我官份,道長只厘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任贯吓,我火速辦了婚禮懈凹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悄谐。我一直安慰自己介评,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布爬舰。 她就那樣靜靜地躺著们陆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪情屹。 梳的紋絲不亂的頭發(fā)上坪仇,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音垃你,去河邊找鬼椅文。 笑死喂很,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的皆刺。 我是一名探鬼主播少辣,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼羡蛾!你這毒婦竟也來了漓帅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤痴怨,失蹤者是張志新(化名)和其女友劉穎忙干,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浪藻,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡捐迫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了爱葵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弓乙。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖钧惧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情勾习,我是刑警寧澤浓瞪,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站巧婶,受9級特大地震影響乾颁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜艺栈,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一英岭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧湿右,春花似錦诅妹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丈莺,卻和暖如春划煮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缔俄。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工弛秋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留器躏,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓蟹略,卻偏偏與公主長得像登失,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子科乎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容