一、分组查询

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)

image-20200728134024022

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()

image-20200728141918469

  • 查询评论数大于点赞数的文章
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("查询成功")
最后修改日期: 2023年12月16日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。