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)
    
  • 相关阅读:
    一个关于STL list使用 小示例
    c++几个通用工具
    修改pc机的mac地址 以及 mac地址的组成
    win7 下 arp 绑定mac和Ip
    wireshark如何抓取别人电脑的数据包
    WPA破解原理简要——无线网络破解续
    Apache配置代理服务器的方法(2)
    Apache配置代理服务器的方法(1)
    在Linux系统中如何设置APACHE服务器里的后台页面只允许某个IP地址访问
    Apache服务器配置技巧
  • 原文地址:https://www.cnblogs.com/chanyuli/p/11748064.html
Copyright © 2011-2022 走看看