用法: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è)置)
|