django orm 分组查询 F查询 Q查询

分组查询

  • 原生SQL:select avg(price) from book group by publish_id;

  • orm中的分组

    统计每个出版社出版的书籍的平均价格
    ret=models.Book.objects.values('publishs_id').annotate(a=Avg('price'))
    
    ret=models.Publish.objects.annotate(a=Avg('book__price')).values('a')
    
  • F查询与Q查询

    • F查询:自己单单里面的字段比较

      from django.db.models import F,Q
      # 点赞数大于评论数
      models.Book.objects.filter(good__gt=F('comment'))
      #  点赞数大于评论数+20
      models.Book.objects.filter(good__gt=F('comment')+20)
      # 让表里的字段price都加20
      models.Book.objects.all().update(price=F('price')+20)
      
    • Q查询:结合filter函数 和_gt lt等下划线方法一同使用

      # 评论数 点赞数都大于80的
      models.Book.objects.filter(good__gt=80,comment__gt=80)
      # 评论数大于等于80 或 点赞数大于等于80的
      models.Book.objects.filter(Q(good_gte=80)|Q(good_gte=80))
      
      
  • orm执行原生SQL语句

    models.Publish.objects.raw('select * from app01_publish;')  # <RawQuerySet: select * from app01_book>
    
  • 直接执行自定义的SQL语句

    from django.db import connection,connections
    cursor = connection.cursor()
    cursor.execute(sql,[1,])
    cursor.fetchall()
    
  • 展示SQL

    from django.db import connection
    print(connection.queries)
    
  • orm练习

    • 查询每个作者的姓名以及出版的书的最高价格

      ret = models.Author.objects.annotate(a=Max('book__price')).values('name','a')
      
    • 查询作者id大于2或者作者年龄大于等于20岁的女作者的姓名以及出版的书的最高价格

      ret = models.Author.objects.filter(Q(id__gt=2)|Q(age__gtq=20,sex='female')).annotate(a=Max('book__price')).values('name','a')
      
    • 查询每个作者出版的书的最高价格的平均值

      ret = models.Author.objects.annotate(a=Max('book__price')).aggregate(Avg('a'))
      
原文地址:https://www.cnblogs.com/he-qing-qing/p/11245471.html