首页 > 其他分享 >django 07 ORM查询优化

django 07 ORM查询优化

时间:2022-12-16 21:00:12浏览次数:48  
标签:obj 07 objects models res price 查询 ORM django

分组查询

"""
默认只能够直接获取分组的字段,其他字段需要使用方法我们也可以忽略掉该特性 将sql_mode中only_full_group_by配置移除即可
"""

# 1.统计每一本书的作者个数
# 按照整条数据分组,按照书籍记录分组
res = models.Book.objects.annotate(author_num=Count('authors__pk')).values('title','author_num')
# 按照表中的字段分组 annotate之前values括号中指定的字段分组
res1 = models.Book.objects.values('publish_id').annotate(book_num=Count('pk')).values('publish_id','book_num')

# 2.统计出每个出版社卖的最便宜的书的价格
res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name','min_price')

# 3.统计不止一个作者的图书
res = models.Book.objects.annotate(count_author=Count('author__pk')).values('publish_id','book_num')

# 4.查询各个作者出的书的总价格
res = models.Author.objects.annotate(book_sum_price=Sum('book__price')).values('name','book_sum_price')

聚合查询

# 1.聚合函数
max,min,sum,avg,count

# 2.使用聚合查询
from django.db.models import Max, Min, Sum, Avg, Count

# 3.在没有分组之前单纯使用聚合查询,使用关键字aggregate
  例:
res = models.Book.objects.aggregate(Max('price'), Min('price'),Sum('price'),Avg('price'),Count('pk'))

F查询与Q查询

# 对于表中有数据又要添加新数据的时候,需要指定一些参数
  1.设置字段值允许为空     null=True
  2.设置字段默认值        default=1000
  3.在终端中直接给出默认值  1 provide a default values

# 1.F查询
  -1.查询条件来自表中其他字段,而非自定义字段
  -2.使用前需要先导入模块
     from django.db.models import F
     # 1.查询库存数大于卖出的书籍
     res = models.Book.objects.filter(storage_num__gt=F('sale_num'))
     # 2.将所有书籍的价格上涨1000
     res = models.Book.objects.update(price=F('price') + 1000)
     # 3.将所有(特定的)书籍名称加上爆款后缀
- 修改字符串类型的模块时需要额外导入模块
  """
  from django.db.models.functions import Concat
  from django.db.models import Value
  """
   res = models.Book.objects.filter(pk=5).update(title=Concat(F('title'), Value('爆款'))))



# 2.Q查询
  -1.执行更复杂的查询(例如OR语句),必须使用q查询。
改变多个条件之间的逻辑运算符,还能将查询条件的字段改为字符串形式
  -2.使用前需要先导入模块
      from django.db.models import Q
    """
     多个条件之间用管道符|是或的关系
     取反在Q的前面加波浪号~(not)
     -1. 将查询条件的字段改为字符串形式
         Q产生的对象 = Q()
         Q产生的对象.children.append(('pk', 1)) # 添加条件(字符串,数据值)
    """  

ORM查询优化

# orm默认是惰性查询
# orm语句在后续代码中真正需要使用的时候才会执行
# orm自带limit分页
# 减轻数据库端以及服务端的压力

# 1.ORM查询优化之defer与only
    res = models.Book.objects.only('title','price')
    for obj in res:
        print(obj.title)
        print(obj.price)
        print(obj.publish_time)
    """
     -1.only可以将括号里的字段封装为数据对象,对象通过句点符点击时不走数据库查询
     -2.对象也可以点击括号内没有的字段,但是会走数据库查询
    """
    res = models.Book.objects.defer('title','price')
    for obj in res:
        print(obj.title)
        print(obj.price)
        print(obj.publish_time)
    """ defer的作用与only相反"""

# 2.ORM查询优化之select_related与prefetch_related
    res = models.Book.objects.select_related('authors')
    for obj in res:
        print(obj.publish.name)
    -1.select_related括号内只能接收外键字段(一对一,一对多)自动将表连接。
    -2.得出的数据对象通过句点符点击表中数据的时不会再走数据库查询
       res = models.Book.objects.prefetch_related('publish')
           for obj in res:
               print(obj.publish.name)
    -3.prefetch_related底层是子查询,查询后的结果会一次封装到对象中。用户在使用的时候是感觉不出来的

 

标签:obj,07,objects,models,res,price,查询,ORM,django
From: https://www.cnblogs.com/juzijunjun/p/16988287.html

相关文章