分组聚合FQ查询

一、分组和聚合查询

1、aggregate(*args,**kwargs)  聚合函数

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

from django.db.models import Avg,Sum,Max,Min
    #求书籍的平均价
    ret=models.Book.objects.all().aggregate(Avg('price'))
    #{'price__avg': 145.23076923076923}

    #参与西游记著作的作者中最老的一位作者
    ret=models.Book.objects.filter(title__icontains='西游记').values('author__age').aggregate(Max('author__age'))
    #{'author__age__max': 518}

    #查看根哥出过得书中价格最贵一本
    ret=models.Author.objects.filter(name__contains='根').values('book__price').aggregate(Max('book__price'))
    #{'book__price__max': Decimal('234.000')}

  2、annotate(*args,**kwargs)  分组函数

#查看每一位作者出过的书中最贵的一本(按作者名分组 values() 然后annotate 分别取每人出过的书价格最高的)
    ret=models.Book.objects.values('author__name').annotate(Max('price'))
    # < QuerySet[
    # {'author__name': '吴承恩', 'price__max': Decimal('234.000')},
    # {'author__name': '吕不韦','price__max': Decimal('234.000')},
    # {'author__name': '姜子牙', 'price__max': Decimal('123.000')},
    # {'author__name': '亚微',price__max': Decimal('123.000')},
    # {'author__name': '伯夷 ', 'price__max': Decimal('2010.000')},
    # {'author__name': '叔齐','price__max': Decimal('200.000')},
    # {'author__name': '陈涛', 'price__max': Decimal('234.000')},
    # {'author__name': '高路川', price__max': Decimal('234.000')}
    # ] >

    #查看每本书的作者中最老的    按作者姓名分组 分别求出每组中年龄最大的
    ret=models.Book.objects.values('author__name').annotate(Max('author__age'))
    # < QuerySet[
    #  {'author__name': '吴承恩', 'author__age__max': 518},
    #  {'author__name': '张X', 'author__age__max': 18},
    #  { 'author__name': '张X杰', 'author__age__max': 56},
    #  {'author__name': '方X伟', 'author__age__max': 26},
    #  {'author__name': '游X兵', 'author__age__max': 35},
    #  {'author__name': '金庸', 'author__age__max': 89},
    #  { 'author__name': 'X涛', 'author__age__max': 27},
    #  {'author__name': '高XX', 'author__age__max': 26}
    # ] >

    #查看 每个出版社 出版的最便宜的一本书
    ret=models.Book.objects.values('publish__name').annotate(Min('price'))
    # < QuerySet[
    # {'publish__name': '北大出版社','price__min': Decimal('67.000')},
    # {'publish__name': '山西出版社','price__min': Decimal('34.000')},
    # {'publish__name': '河北出版社', 'price__min': Decimal('123.000')},
    # {'publish__name': '浙江出版社', 'price__min': Decimal('2.000')},
    # {'publish__name': '湖北出版社', 'price__min': Decimal('124.000')},
    # {'publish__name': '湖南出版社',price__min': Decimal('15.000')}
    # ] >

  

二、F查询与Q查询

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

1、F 可以获取对象中的字段的属性(列),并对其进行操作;

from django.db.models import F,Q
    #F 可以获取对象中的字段的属性(列),并且对其进行操作;
    models.Book.objects.all().update(price=F('price')+1)   #对图书馆里的每一本书的价格 上调1块钱

2、Q多条件组合查询

 Q()可以使orm的fifter()方法支持, 多个查询条件,使用逻辑关系(&、|、~)包含、组合到一起进行多条件查询;

语法:

fifter(Q(查询条件1)| Q(查询条件2))

fifter(Q(查询条件2)& Q(查询条件3))

fifter(Q(查询条件4)& ~Q(查询条件5))

fifter(Q(查询条件6)| Q(Q(查询条件4)& ~ Q(Q(查询条件5)& Q(查询条件3)))包含

from django.db.models import F,Q
    1、F 可以获取对象中的字段的属性(列),并且对其进行操作;
    # models.Book.objects.all().update(price=F('price')+1)
    2、Q多条件组合查询
    #如果 多个查询条件 涉及到逻辑使用 fifter(,隔开)可以表示与,但没法表示或非得关系
    #查询 书名包含作者名的书
    book=models.Book.objects.filter(title__icontains='伟',author__name__contains='伟').values('title')
    #如何让orm 中得 fifter 支持逻辑判断+多条件查询? Q()登场
    book=models.Book.objects.filter(Q(title__icontains='伟') & Q(author__name__contains='伟')).values('title')
    book=models.Book.objects.filter(Q(author__name__contains='伟') & ~Q(title__icontains='伟')).values('title')

   #多条件包含组合查询
   #查询作者姓名中包含 方/少/伟/书名包含伟3字 并且出版社地址以山西开头的书
    book=models.Book.objects.filter(
                                    Q(
                                    Q(author__name__contains='方') |
                                    Q(author__name__contains='少') |
                                    Q(title__icontains='伟')|
                                    Q(author__name__contains='伟')
                                    )
                                    &
                                    Q(publish__addr__contains='山西')
                                    ).values('title')
    print(book)
    return HttpResponse('OK')

  

原文地址:https://www.cnblogs.com/kevin-red-heart/p/10477512.html