zoukankan      html  css  js  c++  java
  • 聚合查询、分组查询、 F与Q查询

    聚合查询

    关键字:aggregate

    当然要导入模块了。

    from django.db.models import Max,Min,Count,Sum,Avg
         统计所有书平均价格
        #查询平均数
         res = models.Book.objects.all().aggregate(Avg('price'))
        #最大值
         res1 = models.Book.objects.all().aggregate(Max('price'))
        #最小值
         res2 = models.Book.objects.all().aggregate(Min('price'))
        #总和
         res3 = models.Book.objects.all().aggregate(Sum('price'))
        #查询总数量
         res4 = models.Book.objects.all().aggregate(Count('title'))
    

    分组查询

    关键字:annotate

    分组查询就是mysql里的 group by,按照什么来分组,就相当于是把多条记录压缩成一条。

    正向反向查询的规则在这里一样受用。

        1.统计每一本书的作者个数 #按照书来分组,每一本书都有可能有多条记录,但是只会显示一条。
        res = models.Book.objects.annotate(author_num = Count('authors')).values('author_num')
        print(res)
    
        2.统计出每个出版社卖的最便宜的书的价格
        res = models.Publish.objects.annotate(price_min=Min('book__price')).values('price_min')
        print(res)
    
        3.统计不止一个作者的图书
        """
        1.统计每本书对应的作者个数
        2.基于上面的结果 筛选出作者个数大于1 的
    
        """
        res = models.Book.objects.annotate(author_num=Count('authors')).filter(author_num__gt=1).values('author_num')
        print(res)
    
        4.查询各个作者出的书的总价格
        res = models.Author.objects.annotate(sum_price=Sum('book__price')).values('sum_price')
        print(res)
    

    F与Q查询

    我们之前在查询数据库的时候条件都是我们自己手写的但是现在出现了条件是从数据库里面获取的,比如说查询名字是三国演义的书, 现在要我们查出售比库存多的书,两个信息都是数据库里拿的,所以就要用到F。

    不出意料的是,我们也要倒入模块。

    F:

        from django.db.models import F,Q
        # 1.查询出卖出数大于库存数的书籍
        res = models.Book.objects.filter(maichu__gt=F('kucun'))
        print(res)
    
        # 2.将所有的书的价格 全部提高100块
        models.Book.objects.update(price=F('price') + 100)
    
    

    Q:

        # 1.查询书籍名称是python入门或者价格是544.44的书
        res = models.Book.objects.filter(title='python入门',price=544.44)
        res = models.Book.objects.filter(Q(title='python入门'),Q(price=544.44))  # 逗号就是and
        res = models.Book.objects.filter(Q(title='python入门')|Q(kucun=666))  # 用来Q之后 就能够支持|表示或
        res = models.Book.objects.filter(~Q(title='python入门')|Q(kucun=666))  # esc下面那个键 波浪号  表示非
        print(res)
    
        # Q查询进阶用法   用Q产生对象 然后再使用
        q = Q()
        q.connector = 'or'
        q.children.append(('title__icontains','p'))
        # q.children.append(('kucun',666))
        res = models.Book.objects.filter(q)
        print(res)
    
  • 相关阅读:
    专职DBA-MySQL体系结构与基本管理
    JSON
    MIME类型
    文件上传下载
    response常用的方法
    2020.11.27小记
    HTTP请求状态码
    1561. Maximum Number of Coins You Can Get
    1558. Minimum Numbers of Function Calls to Make Target Array
    1557. Minimum Number of Vertices to Reach All Nodes
  • 原文地址:https://www.cnblogs.com/chanyuli/p/11748064.html
Copyright © 2011-2022 走看看