• 聚合查询、分组查询、F&Q查询


    一、聚合查询和分组查询

    1、aggregate(*args, **kwargs):

      通过对QuerySet进行计算,返回一个聚合值的字典。aggregate()中每个参数都指定一个包含在字典中的返回值。即在查询集上生成聚合。

    from django.db.models import Avg,Min,Sum,Max
    
    
    # 从整个查询集生成统计值。比如,你想要计算所有在售书的平均价钱。Django的查询语法提供了一种方式描述所有图书的集合。
    
    Book.objects.all().aggregate(Avg('price'))
    
    # {'price_avg':34.35}
    # aggregate()子句的参数描述了我们想要计算的聚合值,在这个例子中,是Book模型中price字段的平均值
    
    # aggregate()是QuerySet的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。如果你想要为聚合指定一个名称,可以向聚合子句提供它:
    
    Book.objectsaggregate(average_price=Avg('price'))
    # {'average_price':34.35}
    
    # 如果你也想知道所有图书价格的最大值和最小值,可以这样查询:
    Book.objects.aggregate(Avg('price')),Max('price'),Min('price'))
    # {'price_avg':34.35,'price_max':Decimal('81,20'),'price_min'}:Decimal('12.99')}
    

    2、annotate(*args,**kwargs):

      可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合。

    # 查询shan出的书总价格
    Book.ojcets.filter(authors__name='shan').values('title')  # 查询出shan写的所有书的书名
    Book.objects.filter(authors__name='shan').aggragare(Sum('price'))
    
    
    # 查询各个作者出的书的总价格,这里就涉及到了分组,分组条件是authors_name
    Book.objects.values('authors__name').annotate(Sum('price'))
    
    
    # 查询各个出版社最便宜的书价是多少
    Book.objects.values('publisher__name').annotate(Min('price'))  

    二、F查询和Q查询

      仅仅靠单一的关键字参数查询已经很难满足查询要求。此时Django为我们提供了F和Q查询:

    # F 使用查询条件的值,专门取对象中某列值的操作
    
        from django.db.models import F
    
        models.Tb1.objects.update(num=F('num')+1)
    
    # Q 构建搜索条件
        from django.db.models import Q
        
        # 1 Q对象(django.db.models.Q)可以对关键字参数进行封装,从而更好地应用多个查询
        q1 = models.Book.objects.filter(Q(title__startswith='P')).all() # 书的标题是以P开头的对象
    
        
        # 2、可以组合使用&,|操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象。
        Q(title__startswith="P") | ~Q(title__startswith='J')
    
        # 3、Q对象可以用~操作符放在前面表示否定,也可允许否定与不否定形式的组合
        Q(title__startswith='P') | ~Q(pub_date__year=2018)
    
        # 4、应用范围:
        
        Book.objects.get(
                Q(title__startswith='P'),
                Q(pub_date=date(2018,10,12)) | Q(pub_date=date(2018,5,21))
        )
    
        # 5、Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。
        # 正确:
        Book.objects.get(
            Q(pub_date=date(2018,10,12)) |     
            Q(pub_date=date(2018,5,21)),title__startswith='P')
        # 错误:
        Book.objects.get(
            question__startswith='P',
            Q(pub_date=date(2018,10,12)) | Q(pub_date=date(2018,5,21))
    

      

      

  • 相关阅读:
    ultraedit 窗口布局
    Oracle之Char VarChar VarChar2
    Python之pickle
    Python之xpath
    Python常用数据结构之heapq模块
    Python实现排序算法之快速排序
    Python常用数据结构之collections模块
    New York is 3 hours ahead of California
    leetcode978
    leetcode979
  • 原文地址:https://www.cnblogs.com/wjs521/p/9779121.html
Copyright © 2020-2023  润新知