聚合,分组,F,Q查询,时间调整

小知识点

*号打散

列表字典或则元组前面加*号相当于作用是将列表解开成两个独立的参数,传入函数,还有类似的有两个星号,是将字典解开成独立的元素作为形参。

a=[1,2,3]
b=(1,2,3)
c={1:“a”,2:“b”,3:“c”}
print(a,"",*a)
print(b,"",*b)
print(c,"====",*c)

运行结果为:
[1, 2, 3] ==== 1 2 3
(1, 2, 3) ==== 1 2 3
{1: ‘a’, 2: ‘b’, 3: ‘c’} ==== 1 2 3

redirect重定向

redirect(name)只支持没有动态匹配的别名反向解析,
就是路由后面没有起别名传参数

聚合查询

聚合函数:Max Min Sum Count Avg
在ORM中支持单独使用聚合函数  aggregate 

from django.db.models import Max, Min, Sum, Count, Avg
res = models.Book.objects.aggregate(Max('price'), Count('pk'), 最小价格=Min('price'), allPrice=Sum('price'),平均价格=Avg('price'))
print(res)

分组查询

"""
如果执行orm分组查询报错 并且有关键字sql_mode strict mode
	移除sql_mode中的only_full_group_by
"""
# 分组查询
    # 统计每一本书的作者个数
     res=models.Book.objects.annotate(author_num=Count('authors__pk')).values('title','author_num')
 print(res)
    # 统计出每个出版社卖的最便宜的书的价格
    res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name', 'min_price')
     print(res)
    # 统计不止一个作者的图书
    # 1.先统计每本书的作者个数
     res = models.Book.objects.annotate(author_num=Count('authors__pk'))
    # 2.筛选出作者个数大于1的数据
     res = models.Book.objects.annotate(author_num=Count('authors__pk')).filter(author_num__gt=1).values('title','author_num')
     print(res)
    # 查询每个作者出的书的总价格
     res = models.Author.objects.annotate(总价=Sum('book__price'),count_book=Count('book__pk')).values('name','总价','count_book')
     print(res)
    """
    models.表名.objects.annotate()                            按照表分组
    models.表名.objects.values('字段名').annotate()            按照values括号内指定的字段分组
    """
    res = models.Book.objects.values('publish_id').annotate(count_pk=Count('pk')).values('publish_id', 'count_pk') 
    #以外键字段出版社id为指定字段,得到每个出版社有多少书
    print(res)

F与Q查询

F查询:
'''当查询条件不是明确的 也需要从数据库中获取 就需要使用F查询
   当你的查询条件也是来自同一张表里面的数据,就需要使用F查询
'''
from django.db.models import F
# 1.查询卖出数大于库存数的书籍
 res = models.Book.objects.filter(kucun__gt=F('maichu'))
 print(res)
# 2.将所有书的价格涨800
 models.Book.objects.update(price=F('price') + 800)
# 3.将所有书的名称后面追加爆款
from django.db.models.functions import Concat #(相当于拼接的意思)
from django.db.models import Value #添加的值
models.Book.objects.update(title=Concat(F('title'), Value('新款')))


Q查询:
# 查询主键是1或者价格大于2000的书籍
# res = models.Book.objects.filter(pk=1, price__gt=2000)  # 逗号默认是and关系
from django.db.models import Q
# res = models.Book.objects.filter(Q(pk=1), Q(price__gt=2000))  # 逗号是and
# res = models.Book.objects.filter(Q(pk=1) | Q(price__gt=2000))  # |是or
res = models.Book.objects.filter(~Q(pk=1) | Q(price__gt=2000))  # ~是not
print(res.query)

时间格式

image

posted @ 2023-04-27 17:15  无敌大帅逼  阅读(49)  评论(0)    收藏  举报