小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

聚合查詢、聚合函數(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"))

分組查詢
統(tǒng)計(jì)每一本書的作者的個(gè)數(shù)
models.Book.object.all().annotate(author_num=Count("author"))
統(tǒng)計(jì)出每個(gè)出版社賣的最便宜的書的價(jià)格
sss

統(tǒng)計(jì)不止一個(gè)作者的書
models.Book.object.annotate(author_num=Count("author")).filter(author_num__get=1)

查詢各個(gè)作者出的書的總價(jià)格
models.Author.object.annotate(sum_price=Sum("book__price")).values("name","sum_price")

總結(jié)

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

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

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

F與Q查詢

F查詢:
Django提供F()來做比較查詢,F()的實(shí)例可以在查詢中引用字段,來比教同一個(gè)model實(shí)例中兩個(gè)不同的字段的值.

示例:
1.查詢出賣出數(shù)大于庫存數(shù)的書籍
from django.db.models import F  #先導(dǎo)入F模塊
res = models.Book.objects.filter(maichu__gt=F('kuncun'))
F可以幫我們?nèi)〉侥硞€(gè)字段對應(yīng)的值來當(dāng)做我的篩選條件,而不是我指定的了,他實(shí)現(xiàn)了一個(gè)動態(tài)比較的效果.

Django支持F()對象之間以及F()對象和常數(shù)之間的加減乘除和取模的操作.基于此我們就可以對表中的數(shù)值類型進(jìn)行數(shù)學(xué)運(yùn)算

2.將每個(gè)書籍的價(jià)格提高50元
models.Book.objects.update(price=F('pirce') 50) #很簡單吧.

3.拼接char字段.
如: 我們要把書名后面加上'新款'(這個(gè)時(shí)候需要對字符串進(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查詢
filter()等方法中用逗號隔開的條件是與的關(guān)系.如果你想要執(zhí)行更復(fù)雜的語句(例如or語句).你可以使用Q對象.

示例:
1.查詢出賣出數(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)) #對條件包裹Q,實(shí)現(xiàn)或者

2.示例:
查詢庫存數(shù)是100并且賣出數(shù)不是0的數(shù)
models.Book.object.filter(Q(kucun=100)&`Q(maichu=0))
&表示并且,`表示取反

事務(wù)

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

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

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

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

兩者都是對數(shù)據(jù)的修改保存操作,但是save()函數(shù)是將數(shù)據(jù)列的全部數(shù)據(jù)項(xiàng)全部都重新寫一遍,而update()則是針對修改的項(xiàng)進(jìn)行針對的更新它頻率高耗時(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主要針對一對一和多對一的關(guān)系進(jìn)行優(yōu)化
      2.select_related使用sql的join語句進(jìn)行優(yōu)化,減少sql的查詢次數(shù),來提高性能

def prefetch_related(self, *lookups)
    性能相關(guān): 多表聯(lián)表操作時(shí)速度會很慢,它是使用多次sql查詢在python中實(shí)現(xiàn)聯(lián)表操作
    
    總結(jié):
      1.對于多對多字段和一對多字段,可以使用prefetch_related()來進(jìn)行優(yōu)化
      2.prefetch_related()的優(yōu)化方式是分別查詢每個(gè)表,然后用python來處理他們之間的關(guān)系

方法大全

def all(self)
    #獲取所有的數(shù)據(jù)對象
    
def filter(self, *args, **kwargs)
    #條件查詢
    #條件可以是: 參數(shù), 字典, Q
def exclude(self, *args, **kwargs)
    # 條件查詢
    # 條件可以是:參數(shù),字典,Q

def select_related(self, *fields)
    性能相關(guān):表之間進(jìn)行join連表操作,一次性獲取關(guān)聯(lián)的數(shù)據(jù)。

    總結(jié):
    1. select_related主要針一對一和多對一關(guān)系進(jìn)行優(yōu)化。
    2. select_related使用SQL的JOIN語句進(jìn)行優(yōu)化,通過減少SQL查詢的次數(shù)來進(jìn)行優(yōu)化、提高性能。

def prefetch_related(self, *lookups)
    性能相關(guān):多表連表操作時(shí)速度會慢,使用其執(zhí)行多次SQL查詢在Python代碼中實(shí)現(xiàn)連表操作。

    總結(jié):
    1. 對于多對多字段(ManyToManyField)和一對多字段,可以使用prefetch_related()來進(jìn)行優(yōu)化。
    2. prefetch_related()的優(yōu)化方式是分別查詢每個(gè)表,然后用Python處理他們之間的關(guān)系。

def annotate(self, *args, **kwargs)
    # 用于實(shí)現(xiàn)聚合group by查詢

    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)造額外的查詢條件或者映射,如:子查詢

    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ù)庫,參數(shù)為別名(setting中的設(shè)置)

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多