orm(中)

内容概要

  • 聚合查询
  • 分组查询
  • F与Q查询

聚合查询

聚合函数


                最大值 最小值 求和 统计 平均值
from django.db.models import Max, Min, Sum, Count, Avg
# 获取书中价格最高的
"""
在mysql中 我们会先连表 然后按作者分组 然后去拿书名
"""
res = models.Book.objects.aggregate(Max('price'))
print(res)

res = models.Book.objects.aggregate(max_price=Max('price')).get('max_price')
"""还可以起别名 然后 在get   如果你不起别名 django 会自动给你起一个"""
print(res)
# 书的价格最低的
res = models.Book.objects.aggregate(Min('price'))
print(res)
# 全部书的总价格
res = models.Book.objects.aggregate(Sum('price'))
print(res)
# 现在有几本书
res = models.Book.objects.aggregate(Count('pk'))
print(res)
# 所有书的平均价格
res = models.Book.objects.aggregate(Avg('price'))
print(res)

分组查询

"""
如果执行ORM分组查询报错  并且有关键字sql_mode stric mode
 移除sql_mode 中的 only_full_group_by

"""
    from django.db.models import Count, Sum, Max, Min, Avg
    # 统计每本书的作者个数
    """
     在MySQL 中 先连表 然后在 分组在统计作者个数
    """
    """
    按表分组
    """
    res = models.Book.objects.annotate(a_c=Count('authors__pk')).values('name', 'a_c')
    print(res)

    """
    按表中字段分组
    """
    res = models.Book.objects.values('name').annotate(a_c=Count('authors__pk')).values('name', 'a_c')
    print(res)

新加字段

F与Q查询

F查询

    from django.db.models import F
    # 1.查询库存大于卖出数的书籍
    """
    当条件不是明确的  也需要从数据库中获取
    需要使用F查询
    """
     res = models.Book.objects.filter(kucun__gt=F('maichu')).values('name')
     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(name=Concat(F('name'), Value('新款')))
res = models.Book.objects.all().values('name')
print(res)

Q查询

# 查询主键是 1 且价格大于2000的书籍
"""
当条件与条件之间的关系 不是and 的时候需要用Q
"""
from django.db.models import Q
res = models.Book.objects.filter(Q(pk=1), Q(price__gt=2000)).values('name')  # and
print(res)
# 查询主键是 1 或者价格大于2000的书籍
res = models.Book.objects.filter(Q(pk=1) | Q(price__gt=2000)).values('name')  # or
print(res)
# 查询主键不是1 或者价格大于2000的书籍
res = models.Book.objects.filter(~Q(pk=1) | Q(price__gt=2000)).values('name')  # ~ 是 not
print(res)

posted @ 2022-12-17 16:16  可否  阅读(23)  评论(0编辑  收藏  举报