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

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.objects.aggregate(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):

  

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

查询alex出的书总价格      

分享图片

查询各个作者出的书的总价格,这里就涉及到分组了,分组条件是authors__name

分享图片

查询各个出版社最便宜的书价是多少

分享图片

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()
    print(q1)  # [<Book: Python>,<Book: Perl>]
    
    # 2、可以组合使用&,|操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象。
    Q(title__startswith=P) | Q(title__startswith=J)
    
    # 3、Q对象可以用~操作符放在前面表示否定,也可允许否定与不否定形式的组合
    Q(title__startswith=P) | ~Q(pub_date__year=2005)

    # 4、应用范围:
    
    # Each lookup function that takes keyword-arguments (e.g. filter(),
    #  exclude(),get()) can also be passed one or more Q objects as
    # positional (not-named) arguments. If you provide multiple Q object
    # arguments to a lookup function,the arguments will be “AND”ed
    # together. For example:

    Book.objects.get(
        Q(title__startswith=P),Q(pub_date=date(2005,5,2)) | Q(pub_date=date(2005,6))
    )

    # sql:
    # SELECT * from polls WHERE title LIKE ‘P%‘
    #     AND (pub_date = ‘2005-05-02‘ OR pub_date = ‘2005-05-06‘)
    
    # import datetime
    # e=datetime.date(2005,6)  #2005-05-06
    
    # 5、Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。
    # 正确:
    Book.objects.get(
        Q(pub_date=date(2005,6)),title__startswith=P)
    # 错误
    Book.objects.get(
        question__startswith=P,6)))

 三、JSON

1、什么是JSON?

定义:

JSON(JavaScript Object Notation,JS 对象标记) 是一种轻量级的数据交换格式。
它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

讲json对象,不得不提到JS对象:

分享图片

合格的json对象:

["one","two","three"]

{ "one": 1,"two": 2,"three": 3 }

{"names": ["张三","李四"] }

[ { "name": "张三"},{"name": "李四"} ]

2、stringify与parse方法 

JSON.parse():     用于将一个 JSON 字符串转换为 JavaScript 对象 
eg:
console.log(JSON.parse({"name":"Yuan"}));
console.log(JSON.parse({name:"Yuan"})) ;   // 错误
console.log(JSON.parse([12,undefined])) ;   // 错误


JSON.stringify(): 用于将 JavaScript 值转换为 JSON 字符串。 
eg:  console.log(JSON.stringify({name:"egon"})) ;

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...