一、分组查询
1.1 介绍
SQL中提到聚合分组就想到了group by,在ORM中的聚合分组通过annotate方法实现
1.2 单表分组查询
- 查询每一个部门的人数
models.py
class Emp(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
salary = models.DecimalField(max_digits=5,decimal_places=2)
dep = models.CharField(max_length=22)
province = models.CharField(max_length=32)
def query(request):
queryset = Emp.objects.values("dep").annotate(c=Count("dep")).values("dep","c")
print(queryset)
return HttpResponse("查询成功")
备注:先获取到dep的值,然后再进行分组
- 查询每一个省份的平均薪水
def query(request):
from django.db.models import F, Q, Avg
queryset = Emp.objects.values("province").annotate(salary_avg=Avg("salary"))
print(queryset)
return HttpResponse("查询成功")
备注:先查询对对应省份“province”,再对其进行分组。谁分组则values哪个字段
1.3 多表分组查询
- 查询每一个出版社的名字和出版过的所有书籍的平均价格
def query(request):
from django.db.models import F, Q, Avg
queryset = Publish.objects.filter().annotate(price_avg=Avg("book__price")).values("name","price_avg")
print(queryset)
return HttpResponse("查询成功")
备注:orm查询比较灵活,它可以有多种方式实现
- 查询每一个作者的名字以及出版书籍的个数
def query(request):
from django.db.models import F, Q, Avg
queryset = Author.objects.filter().annotate(c=Count("book__title")).values("name","c")
print(queryset)
return HttpResponse("查询成功")
- 查询每一个书籍的名称以及作者的个数
def query(request):
from django.db.models import F, Q, Avg
queryset = Book.objects.filter().annotate(c=Count("author__pk")).values("title","c")
print(queryset)
return HttpResponse("查询成功")
- 查询作者个数大于1的每一本书籍的名称和作者个数
def query(request):
from django.db.models import F, Q, Avg
queryset = Book.objects.filter().annotate(c=Count("author")).filter(c__gt=1).values("title","c")
print(queryset)
return HttpResponse("查询成功")
备注:这里要梳理清楚用哪张表进行分组
- 查询书籍名称包含”h”的书籍名称和作者个数
def query(request):
from django.db.models import F, Q, Avg
queryset = Book.objects.filter(title__contains="h").annotate(c=Count("author")).values("title","c")
print(queryset)
return HttpResponse("查询成功")
二、F和Q查询
2.1 F查询
F查询可以理解成查询出某个数值要大于另外一个查询数值的结果
- models.py
class Article(models.Model):
title = models.CharField(max_length=32)
comment_num = models.IntegerField(default=100)
poll_num = models.IntegerField()
- 查询评论数大于点赞数的文章
def query(request):
from django.db.models import F, Q, Avg
queryset = Article.objects.filter(poll_num__gt=F("comment_num")).values("title")
print(queryset)
return HttpResponse("查询成功")
- 查询点赞数大于两倍评论数的文章
def query(request):
from django.db.models import F, Q, Avg
queryset = Article.objects.filter(comment_num__gt=F("poll_num")*2).values("title")
print(queryset)
return HttpResponse("查询成功")
- 将所有书籍价格提高100元
def query(request):
from django.db.models import F, Q, Avg
queryset = Book.objects.update(price=F("price") +100 )
print(queryset)
return HttpResponse("查询成功")
2.2 Q查询
Q查询则相对于条件或 并
- 查询书籍包含”h” 或者以”G”开头的书籍
def query(request):
from django.db.models import F, Q, Avg
queryset = Book.objects.filter(Q(title__contains="h") | Q(title__startswith="G")).values("title")
print(queryset)
return HttpResponse("查询成功")
留言