django框架

7,073 阅读1分钟

聚合查询

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

from django.db.models import Max Min Sun Count Avg
res = models.Book.object.aggregate(Max('price'),Count('pk'))最小价格=Min('price'),allprice=Sun('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)
    
  • 统计不止一个作者的图书 先统计每本书的作者个数

       res = models.Book.objects.annotate(author_num=Count('authors__pk'))
    

    筛选出作者个数大于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')
      print(res)
      
    

F和Q查询

当查询条件不是明确的 也需要从数据库中获取 就需要使用F查询

  • 1.查询库存数大于卖出数的书籍

     from django.db.models import F
      res = models.Book.objects.filter(kucun__gt=F('maichu'))
     print(res)
    

将所有书的价格涨800

 models.Book.objects.update(price=F('price') + 800)
 

将所有书的名称后面追加爆款

from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.update(title=Concat(F('title'), Value('新款')))
  • 查询主键是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)