Django-model聚合查询与分组查询Django-model聚合查询与分组查询
1. 聚合函数包含:SUM AVG MIN MAX COUNT
2. 聚合函数可以单独使⽤,不⼀定要和分组配合使⽤;不过聚合函数⼀般和group by 搭配使⽤
3. aggregate()是QuerySet 的⼀个终⽌⼦句,意思是说,它返回⼀个包含⼀些键值对的字典。
4. 分组查询 annotate 查询出来的结果任然是集合是QuerySet类型;
5. annotate对获取的集合进⾏分组,按照集合的个数分组;
聚合查询的使⽤aggregate()来调⽤
1.查询所有书籍的总价格
from dels import Avg,Count,Min,Max,Sum
def juheQuery(request):
# 统计所有书籍的总价格 aggregate ⽤来调⽤聚合函数的
# 可以通过binming= 来定义别名为 binming
book_list=models.Book.objects.all().aggregate(binming=Sum("price"))
print(book_list)
return HttpResponse("OK")
输出:
{'binming': Decimal('5144.00')}
2.查询出所有书籍的平均价格
from dels import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_list=models.Book.objects.all().aggregate(AVG_binming=Avg("price"))
print(book_list)
return HttpResponse("OK")
输出:
{'AVG_binming': 16.12539184952978}
3.同时查询出,这些书籍的平均值,最⼤值,和最⼩值
from dels import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_list=models.Book.objects.all().aggregate(Avg("price"),Max("price"),Min("price"))
print(book_list)
return HttpResponse("OK")
输出:
{'price__max': Decimal('111.00'), 'price__min': Decimal('11.00'), 'price__avg': 16.12539184952978}
分组查询 annotate()来调⽤
1.统计书本有作者的记录,并求出该书有 ⼏个作者
from dels import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_obj=models.Book.objects.filter(authors__age__gt=0).annotate(c=Count("authors"))
print(book_obj.values_list("title","c"))
return HttpResponse("OK")
输出:
<QuerySet [('三国演义', 3), ('红楼梦1', 1), ('李四的歌', 1), ('ccc', 3)]>
2.统计每个出版社,出版书籍价格的总和
from dels import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_obj=models.Publish.objects.all().annotate(c=Sum("book__price"))
print(book_obj.values_list("name","c"))
return HttpResponse("OK")
输出:
<QuerySet [('⼩黄⼈出版社', Decimal('595.00')), ('⼩红帽出版社', Decimal('4428.00')), ('红太阳出版社', Decimal('121.00'))]> 3.统计每个出版社,出版过的书籍数量
from dels import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_obj=models.Publish.objects.all().annotate(c=Count("book__title"))
print(book_obj.values_list("name","c"))
return HttpResponse("OK")
输出:
<QuerySet [('⼩黄⼈出版社', 30), ('⼩红帽出版社', 284), ('红太阳出版社', 5)]>
4.通过Book表查出每个出版社出版过书籍的本数;
from dels import Avg,Count,Min,Max,Sum
def juheQuery(request):
# 先获取所有的书本集合set,根据集合取出出版社对象⼏个;按照出版社集合分组,计数出版社出版的书籍数量
book_obj=models.Book.objects.all().values_list("publisher__name").annotate(c=Count("title"))
# 取出出版数量c ,以及出版社的名称
print(book_obj.values_list("c","publisher__name"))
return HttpResponse("OK")
5.统计出书名以"三"开头的书籍,作者的个数;
from dels import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_obj=models.Book.objects.filter(title__startswith="三", authors__age__gt=0).annotate(c=Count("authors"))    print(book_obj.values_list("c","title"))
return HttpResponse("OK")
输出:
<QuerySet [(3, '三国演义'), (2, '三⽑流浪记')]>
6.统计作者个数⼤于⼀个⼈的书籍
from dels import Avg,Count,Min,Max,Sum
def juheQuery(request):
book_obj=models.Book.objects.all().annotate(c=Count("authors")).filter(c__gt=1)
print(book_obj.values_list("c","title"))
return HttpResponse("OK")
输出:
<QuerySet [(3, '三国演义'), (3, 'ccc'), (2, '三⽑流浪记')]>
F查询与Q查询
1. F()的实例可以在查询中引⽤字段,来⽐较同⼀个 model 实例中两个不同字段的值。
2. F()也可以⽤来做直接的运算;
django项目实例F查询(可以获取某个字段值):
1.查询出,评论数⼤于阅读数的书籍
from dels import F,Q
def FQQuery(request):
book_obj=models.Book.objects.filter(comment_num__gt=F("read_num"))
print(book_obj.values_list("title"))
return HttpResponse("OK")
输出:
<QuerySet [('⼩兵张嘎',), ('⼈鱼传说',), ('⼩红书',), ('⼩红书',), ('⼩红书',), ('三国演义',)]>
2.查询出,评论数是阅读数2倍的书籍;
from dels import F,Q
def FQQuery(request):
book_obj=models.Book.objects.filter(comment_num__gt=F("read_num")*2)
print(book_obj.values_list("title"))
return HttpResponse("OK")
输出:
<QuerySet [('⼈鱼传说',), ('⼩红书',), ('⼩红书',), ('⼩红书',), ('三国演义',)]>
3.将所有的书籍价格+10
from dels import F,Q
def FQQuery(request):
models.Book.objects.all().update(price=F("price")+10)
return HttpResponse("OK")
Q 查询:使⽤(|或 &且)
1.评论数⼤于100或阅读数⼤于100的书本---|
from dels import F,Q
def FQQuery(request):
book_obj=models.Book.objects.filter(Q(comment_num__gt=100)|Q(read_num__gt=100))    print(book_obj.values_list("title"))
return HttpResponse("OK")
输出:
<QuerySet [('⼈鱼传说',), ('三国演义',)]>
ORM修改和ORM删除
1.ORM修改
1 obj.name="egon"  obj.save()  效率低
2 表.objects.all().update(name="") 推荐
注意点:update⽅法是QuerySet数据类型的⽅法。model对象不能调⽤。
2.ORM删除
表.objects.filter().delete()
注意事项:
1 、 delete()是QuerySet数据类型的⽅法
2 、级联删除

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。