乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      聚合查詢(xún)、聚合函數(shù)

       印度阿三17 2019-10-26

      用法:

      from django.db.models import Avg,Sum,Max,Count,Min
      聚合:
      示例:
      models.Book.object.all().aggregate(Avg("price"))
      你也可以在聚合子句中用它
      models.Book.object.aggregate(average_price=Avg('price'))
      你也可以連續(xù)的使用
      models.Bool.object.all().aggregate(Avg("price"),Max("price"),Min("price"))
      
      分組查詢(xún)
      統(tǒng)計(jì)每一本書(shū)的作者的個(gè)數(shù)
      models.Book.object.all().annotate(author_num=Count("author"))
      統(tǒng)計(jì)出每個(gè)出版社賣(mài)的最便宜的書(shū)的價(jià)格
      sss
      
      統(tǒng)計(jì)不止一個(gè)作者的書(shū)
      models.Book.object.annotate(author_num=Count("author")).filter(author_num__get=1)
      
      查詢(xún)各個(gè)作者出的書(shū)的總價(jià)格
      models.Author.object.annotate(sum_price=Sum("book__price")).values("name","sum_price")

      總結(jié)

      value里面的參數(shù)對(duì)應(yīng)的是sql語(yǔ)句中的select要查找的顯示字段,

      filter里面的參數(shù)相當(dāng)于where或者h(yuǎn)aving里面的篩選條件,

      annotate本身表示group by的作用,前面找尋分組的依據(jù),內(nèi)部放置顯示可能用到的聚合運(yùn)算式,后面跟filter來(lái)增加限制條件,最后的value來(lái)表示分組想要查找的字段

      F與Q查詢(xún)

      F查詢(xún):
      Django提供F()來(lái)做比較查詢(xún),F()的實(shí)例可以在查詢(xún)中引用字段,來(lái)比教同一個(gè)model實(shí)例中兩個(gè)不同的字段的值.
      
      示例:
      1.查詢(xún)出賣(mài)出數(shù)大于庫(kù)存數(shù)的書(shū)籍
      from django.db.models import F  #先導(dǎo)入F模塊
      res = models.Book.objects.filter(maichu__gt=F('kuncun'))
      F可以幫我們?nèi)〉侥硞€(gè)字段對(duì)應(yīng)的值來(lái)當(dāng)做我的篩選條件,而不是我指定的了,他實(shí)現(xiàn)了一個(gè)動(dòng)態(tài)比較的效果.
      
      Django支持F()對(duì)象之間以及F()對(duì)象和常數(shù)之間的加減乘除和取模的操作.基于此我們就可以對(duì)表中的數(shù)值類(lèi)型進(jìn)行數(shù)學(xué)運(yùn)算
      
      2.將每個(gè)書(shū)籍的價(jià)格提高50元
      models.Book.objects.update(price=F('pirce') 50) #很簡(jiǎn)單吧.
      
      3.拼接char字段.
      如: 我們要把書(shū)名后面加上'新款'(這個(gè)時(shí)候需要對(duì)字符串進(jìn)行拼接Concat操作,并且要加上拼接值(Value)
      from django.db.models.functions import Concat
      from django.db.models import Values
      res = models.Book.object.update(name=Concat(F('name').Value('新款')))
      Concat表示的是進(jìn)行字符串的拼接操作,參數(shù)位置決定了拼接在頭部還是在尾部,Value里面是要新增的拼接值
      Q查詢(xún)
      filter()等方法中用逗號(hào)隔開(kāi)的條件是與的關(guān)系.如果你想要執(zhí)行更復(fù)雜的語(yǔ)句(例如or語(yǔ)句).你可以使用Q對(duì)象.
      
      示例:
      1.查詢(xún)出賣(mài)出數(shù)大于100或者價(jià)格小于100塊的
      from django.db.models import Q   #導(dǎo)入Q模塊
      models.Book.objects.filter(Q(maichu__gt=100)|Q(price__lt=100)) #對(duì)條件包裹Q,實(shí)現(xiàn)或者
      
      2.示例:
      查詢(xún)庫(kù)存數(shù)是100并且賣(mài)出數(shù)不是0的數(shù)
      models.Book.object.filter(Q(kucun=100)&`Q(maichu=0))
      &表示并且,`表示取反

      事務(wù)

      事務(wù)的定義:將多個(gè)sql語(yǔ)句操作變成原子性操作,要么同時(shí)成功,有一個(gè)失敗則回滾到原來(lái)的狀態(tài),保證數(shù)據(jù)的完整性和一致性

      #django開(kāi)啟事務(wù)
      事務(wù)四大特性: 原子性, 一致性, 隔離性, 持久性
      from django.db import transaction
      with transaction.atomic():

      幾個(gè)重要的方法比較

      update()和save()的區(qū)別

      兩者都是對(duì)數(shù)據(jù)的修改保存操作,但是save()函數(shù)是將數(shù)據(jù)列的全部數(shù)據(jù)項(xiàng)全部都重新寫(xiě)一遍,而update()則是針對(duì)修改的項(xiàng)進(jìn)行針對(duì)的更新它頻率高耗時(shí)少

      select_related和prefetch_related

      def select_related(self, *fields)
          性能相關(guān):表之間進(jìn)行join聯(lián)表操作,一次性獲取關(guān)聯(lián)的數(shù)據(jù)
          
          總結(jié):
            1.select_related主要針對(duì)一對(duì)一和多對(duì)一的關(guān)系進(jìn)行優(yōu)化
            2.select_related使用sql的join語(yǔ)句進(jìn)行優(yōu)化,減少sql的查詢(xún)次數(shù),來(lái)提高性能
      
      def prefetch_related(self, *lookups)
          性能相關(guān): 多表聯(lián)表操作時(shí)速度會(huì)很慢,它是使用多次sql查詢(xún)?cè)趐ython中實(shí)現(xiàn)聯(lián)表操作
          
          總結(jié):
            1.對(duì)于多對(duì)多字段和一對(duì)多字段,可以使用prefetch_related()來(lái)進(jìn)行優(yōu)化
            2.prefetch_related()的優(yōu)化方式是分別查詢(xún)每個(gè)表,然后用python來(lái)處理他們之間的關(guān)系

      方法大全

      def all(self)
          #獲取所有的數(shù)據(jù)對(duì)象
          
      def filter(self, *args, **kwargs)
          #條件查詢(xún)
          #條件可以是: 參數(shù), 字典, Q
      def exclude(self, *args, **kwargs)
          # 條件查詢(xún)
          # 條件可以是:參數(shù),字典,Q
      
      def select_related(self, *fields)
          性能相關(guān):表之間進(jìn)行join連表操作,一次性獲取關(guān)聯(lián)的數(shù)據(jù)。
      
          總結(jié):
          1. select_related主要針一對(duì)一和多對(duì)一關(guān)系進(jìn)行優(yōu)化。
          2. select_related使用SQL的JOIN語(yǔ)句進(jìn)行優(yōu)化,通過(guò)減少SQL查詢(xún)的次數(shù)來(lái)進(jìn)行優(yōu)化、提高性能。
      
      def prefetch_related(self, *lookups)
          性能相關(guān):多表連表操作時(shí)速度會(huì)慢,使用其執(zhí)行多次SQL查詢(xún)?cè)赑ython代碼中實(shí)現(xiàn)連表操作。
      
          總結(jié):
          1. 對(duì)于多對(duì)多字段(ManyToManyField)和一對(duì)多字段,可以使用prefetch_related()來(lái)進(jìn)行優(yōu)化。
          2. prefetch_related()的優(yōu)化方式是分別查詢(xún)每個(gè)表,然后用Python處理他們之間的關(guān)系。
      
      def annotate(self, *args, **kwargs)
          # 用于實(shí)現(xiàn)聚合group by查詢(xún)
      
          from django.db.models import Count, Avg, Max, Min, Sum
      
          v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id'))
          # SELECT u_id, COUNT(ui) AS `uid` FROM UserInfo GROUP BY u_id
      
          v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id')).filter(uid__gt=1)
          # SELECT u_id, COUNT(ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1
      
          v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id',distinct=True)).filter(uid__gt=1)
          # SELECT u_id, COUNT( DISTINCT ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1
      
      def distinct(self, *field_names)
          # 用于distinct去重
          models.UserInfo.objects.values('nid').distinct()
          # select distinct nid from userinfo
      
          注:只有在PostgreSQL中才能使用distinct進(jìn)行去重
      
      def order_by(self, *field_names)
          # 用于排序
          models.UserInfo.objects.all().order_by('-id','age')
      
      def extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
          # 構(gòu)造額外的查詢(xún)條件或者映射,如:子查詢(xún)
      
          Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
          Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
          Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
          Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])
      
       def reverse(self):
          # 倒序
          models.UserInfo.objects.all().order_by('-nid').reverse()
          # 注:如果存在order_by,reverse則是倒序,如果多個(gè)排序則一一倒序
      
      
       def defer(self, *fields):
          models.UserInfo.objects.defer('username','id')
          或
          models.UserInfo.objects.filter(...).defer('username','id')
          #映射中排除某列數(shù)據(jù)
      
       def only(self, *fields):
          #僅取某個(gè)表中的數(shù)據(jù)
           models.UserInfo.objects.only('username','id')
           或
           models.UserInfo.objects.filter(...).only('username','id')
      
       def using(self, alias):
           指定使用的數(shù)據(jù)庫(kù),參數(shù)為別名(setting中的設(shè)置)

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多