聚合查詢
aggregate()是QuerySet 的一個(gè)終止子句蛾派,意思是說(shuō)帝牡,它返回一個(gè)包含一些鍵值對(duì)的字典往毡。
鍵的名稱是聚合值的標(biāo)識(shí)符,值是計(jì)算出來(lái)的聚合值靶溜。鍵的名稱是按照字段和聚合函數(shù)的名稱自動(dòng)生成出來(lái)的
導(dǎo)入庫(kù) :from django.db.models import Avg,Sum,Count
源數(shù)據(jù)表:
class Mysales(models.Model):
id = models.AutoField(primary_key=True)
number = models.IntegerField(default=1000)
price = models.DecimalField(max_digits=6,decimal_places=2,default=10)
last_number = models.IntegerField(default=800)
total = models.DecimalField(max_digits=12,decimal_places=2,default=10000)
from django.db.models import Avg,Sum,Count,Max,Min
print('聚合用法'.center(50))
ret = models.Mysales.objects.all().aggregate(Avg('number'))
print(ret)
ret1 = models.Mysales.objects.all().aggregate(K=Min('number'),
v=Max('number'))
print(ret1)
運(yùn)行結(jié)果:
聚合用法
{'number__avg': 64259.4}
{'K': 453, 'v': 315355}
分組查詢 相當(dāng)于SQL中g(shù)roup by
annotate()
- 統(tǒng)計(jì)每一本書的作者個(gè)數(shù)
ret = models.Author.objects.all().annotate(price_sum=
Sum("book__price")).values_list("name","price_sum")
for i in ret:
print(i[0],i[1])
F查詢
在上面所有的例子中开瞭,我們構(gòu)造的過(guò)濾器都只是將字段值與某個(gè)常量做比較。如果我們要對(duì)兩個(gè)字段的值做比較罩息,那該怎么做呢嗤详?
Django 提供 F() 來(lái)做這樣的比較。F() 的實(shí)例可以在查詢中引用字段瓷炮,來(lái)比較同一個(gè) model 實(shí)例中兩個(gè)不同字段的值葱色。
- 列出number大于列l(wèi)ast_number的數(shù)據(jù)
from django.db.models import F
ret = models.Mysales.objects.filter(number__gt=F('last_number'))
for i in ret:
print(i.number)
運(yùn)行結(jié)果:
1000
3255
1234
Django 支持 F() 對(duì)象之間以及 F() 對(duì)象和常數(shù)之間的加減乘除和取模的操作。它必須與update()用法相配合
- number 字段同時(shí)*3
from django.db.models import F
models.Mysales.objects.update(number=F('number')*3)
- 計(jì)算total
total = number*price
from django.db.models import F
models.Mysales.objects.update(total = F('number')*F('price'))
Q查詢
filter() 等方法中的關(guān)鍵字參數(shù)查詢都是一起進(jìn)行“AND” 的娘香。 如果你需要執(zhí)行更復(fù)雜的查詢(例如OR語(yǔ)句)苍狰,你可以使用Q對(duì)象办龄。
- 查詢number大于3000或price小于1000的數(shù)據(jù)
from django.db.models import Q
ret = models.Mysales.objects.filter(Q(number__gt=3000)|Q(price__lt=1000))
for i in ret:
print(i.number,i.price,i.total)
運(yùn)行結(jié)果:
3000 13.00 39000.00
1359 353.00 479727.00
946065 34.63 32762230.95
9765 1134.67 11080052.55
3702 345.52 1279115.04