<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          django這些查詢技巧你會(huì)了嗎?

          共 4239字,需瀏覽 9分鐘

           ·

          2020-08-01 02:46

          ?

          小閆分享:不知你是否發(fā)現(xiàn),當(dāng)你越害怕發(fā)生一件事時(shí),它往往真的會(huì)發(fā)生,這就是墨菲定律。墨菲定律本質(zhì)是凡是可能出錯(cuò)的事有很大幾率會(huì)出錯(cuò)。

          ?

          任何不考慮后果的查詢都是耍流氓!更多精彩文章請(qǐng)關(guān)注公眾號(hào)『Pythonnote』或者『全棧技術(shù)精選』

          1.select_related

          ?

          關(guān)聯(lián)查詢優(yōu)化,只會(huì)進(jìn)行「一次」查詢,然后緩存結(jié)果。平時(shí)其他方法都是惰性查詢,當(dāng)每次取值時(shí)都會(huì)查詢一次數(shù)據(jù)庫。

          「建議」:所有關(guān)聯(lián)查詢使用此方法。

          ?

          假設(shè)有兩張表,一張表是書籍,一張表是英雄人物:

          from django.db import models


          # 書籍表
          class BookInfo(models.Model):
              btitle = models.CharField(max_length=20, verbose_name='名稱')

              class Meta:
                  db_table = 'tb_books'
                  

          # 英雄表
          class HeroInfo(models.Model):
              GENDER_CHOICES = (
                  (0'male'),
                  (1'female')
              )
              hname = models.CharField(max_length=20, verbose_name='名稱')
              hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性別')
              hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='圖書')

              class Meta:
                  db_table = 'tb_heros'

          現(xiàn)在要查詢所有的英雄以及他們所在的書籍名稱:

          heros = HeroInfo.objects.select_related('hbook').all()
          # 查詢之后構(gòu)造一個(gè)字典
          heros_dict = {}
          for hero in heros:
             heros_dict[hero.hname] = hero.hbook.btitle  # 關(guān)聯(lián)查詢后,直接使用.取值即可,不會(huì)再進(jìn)行數(shù)據(jù)庫查詢
          ?

          1.如上 select_related 中的參數(shù) hbook 為外鍵名稱,它會(huì)將所關(guān)聯(lián)的表中所有信息都查詢出來。

          2.如果書籍表 BookInfo 中還有外鍵,我們還想再關(guān)聯(lián)查詢那張表的信息,可以用如下的方式:hbook__外鍵名稱,外鍵和外鍵之間用雙下劃線連接。如果有三層關(guān)系可以:外鍵名稱__外鍵名稱__外鍵名稱,以此類推,快樂就完事兒了。

          3.select_related 中還可以通過參數(shù) depth 指定查詢的深度。比如示例中可以改為:select_related(depth=1),它的意思就是往下查詢一層。如果書籍表中還有外鍵,我們都想查詢出來,可以:select_related(depth=2),以此類推。

          4.示例中的方式是指定查詢的外鍵,只查詢了英雄類中所關(guān)聯(lián)的圖書。如果英雄類中有好幾個(gè)外鍵,我們都想關(guān)聯(lián)查詢,參數(shù) depth 的優(yōu)勢就凸顯出來了,不需要詳細(xì)寫出每一個(gè)外鍵的名稱。更多精彩文章請(qǐng)關(guān)注公眾號(hào)『Pythonnote』或者『全棧技術(shù)精選』

          ?

          最后的結(jié)果形如:

          {
            '迪迦''迪迦奧特曼',
            '武松''水滸傳',
            ...
          }

          2.values_list

          ?

          取出指定字段,組成列表

          ?

          比如我需要一個(gè)所有英雄名稱的列表:['迪迦', '武松'...]。你可能想到的方法是查詢出所有的英雄信息,然后遍歷每個(gè)對(duì)象,將對(duì)象的名稱放到指定的列表中,完成需求。使用 values_list 可以一步到位:

          list(HeroInfo.objects.values_list('hname', flat=True))

          2.1 詳解

          1.values_list 中第一個(gè)參數(shù)填寫的是要查詢的字段名稱,此處為 hname ;第二個(gè)參數(shù) flat 設(shè)置為 True 是為了不以元祖的形式展示,而是直接將值取出來,形如:

          
                 
                  '迪迦''武松'...]>
                  
          # 不設(shè)置 flat 結(jié)果如下
          '迪迦',), ( '武松',)...]>

          2.有人會(huì)問:為什么外面要使用 list 方法呢?如上示例,查詢結(jié)果是一個(gè) QuerySet 對(duì)象,為了使用方便,一般根據(jù)需要轉(zhuǎn)換為 python 的列表。

          3.annotate

          ?

          聚合函數(shù)

          ?

          「需求」:統(tǒng)計(jì)出英雄表中男女的數(shù)量,顯示聚合結(jié)果。更多精彩文章請(qǐng)關(guān)注公眾號(hào)『Pythonnote』或者『全棧技術(shù)精選』

          from django.db.models import Count

          HeroInfo.objects.values('hgender').annotate(number=Count('hgender'))

          3.1 詳解

          1.上方的意思是根據(jù)字段 hgender 進(jìn)行分組,然后統(tǒng)計(jì)每組的人數(shù),人數(shù)一列起名為 number

          2.查詢結(jié)果如下:

          
                 
                  'hgender'0'number'10}, {
                  'hgender'1'number'3}]>
                  

          3.可以看出英雄表中男性(0)為 10 人;女性(1)為 3 人。

          4.「注意」valuesannotate 的順序一定要特別關(guān)注!示例中的順序代表根據(jù)性別分組顯示聚合結(jié)果,但是反過來后就變成了先根據(jù) hgender 統(tǒng)計(jì)數(shù)量,最后只取字段 hgender 的值。

          ?

          也許你會(huì)想示例中既然  annotate 可以統(tǒng)計(jì)數(shù)量,那么直接使用去掉 values 不是好了?不對(duì)!它是統(tǒng)計(jì)了數(shù)量,但只是為查詢的每行記錄賦予了一個(gè)新字段 number ,并沒有聚合結(jié)果,不如示例中那樣清晰,哪個(gè)性別有幾個(gè),展示的明明白白。更多精彩文章請(qǐng)關(guān)注公眾號(hào)『Pythonnote』或者『全棧技術(shù)精選』

          ?







          排版:小閆

          圖片素材:小閆

          文案:小閆

          長按掃描下方二維碼即刻關(guān)注小閆




          瀏覽 43
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产婬乱片A片AAA毛姪片 | 看日本黄色片 | 黄色尤物国产黄色小视频在线观看免费 | 在线播放中文字幕 | 性爱在线网站 |