Django(10)ORM聚合查询(二)

简介: Django(10)ORM聚合查询(二)
  • 统计每一本以Python开头的书籍的作者个数


# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
from django.db.models import Avg,Max,Min,Count,Sum
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    res = models.Book.objects.filter(title__startswith="Python").annotate(c = Count("authors__name")).values("title","c")
    print(res)
    return HttpResponse("ok")

访问测试,查看终端输出


44e0a9264cfb4a74ac1a9401e6344cd5.png

12878aeff82c49d9aec94e0d55ccdc4d.png


  • 统计不止一个作者的图书名称
# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
from django.db.models import Avg,Max,Min,Count,Sum
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    res = models.Book.objects.annotate(c = Count("authors__name")).filter(c__gt=0).values("title","c")
    print(res)
    return HttpResponse("ok")
  • 访问测试,查看终端输出



37b2482a59a3482386467016c3f69740.png

9d776571e4294ebba39afb270a757f88.png


  • 根据一本图书作者数量的多少对查询集QuerySet进行降序排序
# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
from django.db.models import Avg,Max,Min,Count,Sum
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    res = models.Book.objects.annotate(c = Count("authors__name")).order_by("-c").values("title","c")
    print(res)
    return HttpResponse("ok")

访问测试,查看终端输出


bc96ea36f60d4f0a9e5a48e11348e552.png



ec47c16eba8d4abc8c11071116e52480.png


  • 查询各个作者出的书的总价格
# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
from django.db.models import Avg,Max,Min,Count,Sum
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    res = models.Author.objects.annotate(all=Sum("book__price")).values("name","all")
    print(res)
    return HttpResponse("ok")
  • 访问测试,查看终端输出


6930ceb736da4fea92434f1b0d9d9112.png

4ef4c369b8df476fbee82898ed5480b8.png

三、F()查询


  • F()的实例可以在查询中引用字段,来比较同一个model实例中两个不同字段的值,之前的过滤器都只是将字段值与某个常量作比较,如果想要对两个字段的值进行比较,就需要用到F()
  • 使用前需要先从django.db.models引入F:
from django.db.models import Avg,Max,Min,Count,Sum,F
  • 语法:F("字段名称")
  • F()动态获取对象字段的值,可以进行运算,Django支持F()对象之间以及F()对象和常数之间的加减乘除和取余的操作,修改操作即update也可以使用F()函数
  • 查询工资大于年龄的人


# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
from django.db.models import Avg,Max,Min,Count,Sum,F
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    book = models.Emp.objects.filter(salary__gt=F("age")).values("name","age")
    print(book)
    return HttpResponse("ok")
  • 访问测试,查看终端输出


584f9b6d17644b8cb3f4621ba8f15111.png

f6ad1e28cd12456ab4eceb31c2a2da5a.png

  • 将每一本书的价格提高100元
# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
from django.db.models import Avg,Max,Min,Count,Sum,F
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    res = models.Book.objects.update(price=F("price")+100)
    print(res)
    return HttpResponse("ok")

访问测试,查看数据库信息,可以看到成功修改价格



ae3229c5bb8d40569d87ad5a04eb0dea.png

2a2c7c5bbd8544d9a6a41d9c0cc88958.png


四、Q()查询


  • 使用前需要在django.db.models中引入Q:


from django.db.models import Avg,Max,Min,Count,Sum,F,Q


  • 用法:Q(条件判断),例如


Q(title__startswith="Python")


之前构造的过滤器里的多个条件的关系都是and,如果需要执行更复杂的查询,例如or语句,就可以使用Q()


Q对象可以使用&,|,~,即与、或、非等操作符进行组合,优先级从高到低为~ & |,可以混合使用Q对象和关键字参数,Q对象和关键字参数是使用and拼在一起的,即把,看成与的关系,但是Q对象必须位于所有关键字参数的前面


查询价格大于350或者名称以Python开头的书籍和名称和价格

# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
from django.db.models import Avg,Max,Min,Count,Sum,F,Q
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    res = models.Book.objects.filter(Q(price__gt=350)|Q(title__startswith="Python")).values("title","price")
    print(res)
    return HttpResponse("ok")
  • 访问测试,查看终端输出

e4e2a3931610445aab0ce1fbade227a2.png

da0fcac8044c481e88630fc05a74768a.png



  • 查询以M教程结尾或者不是2011年11月的书籍
# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
from django.db.models import Avg,Max,Min,Count,Sum,F,Q
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    res = models.Book.objects.filter(Q(title__endswith="M教程")|~Q(Q(pub_date__year=2011) & Q(pub_date__month=11))).values("title","pub_date")
    print(res)
    return HttpResponse("ok")


访问测试,查看终端输出


c9b42db5242f41fea7ed6a20471d10ad.png

a17a17129a7741558481813ef46c9884.png


  • 查询出版日期是2011年11月的或者2012年10月的,并且名称中包含教程
# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
from django.db.models import Avg,Max,Min,Count,Sum,F,Q
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    res = models.Book.objects.filter(Q(pub_date__year=2011) & Q(pub_date__month=11),Q(title__contains="教程")).values("title","pub_date")
    print(res)
    return HttpResponse("ok")

访问测试,查看终端输出


4e15bd0a589242499e427e61a661f86c.png

94acc30e23124fcfb333b753d302f214.png

目录
相关文章
|
1月前
|
SQL Go 数据库
【速存】深入理解Django ORM:编写高效的数据库查询
【速存】深入理解Django ORM:编写高效的数据库查询
58 0
|
1月前
|
SQL 前端开发 Python
基于python-django的neo4j人民的名义关系图谱查询系统
基于python-django的neo4j人民的名义关系图谱查询系统
32 0
|
3月前
|
数据管理 数据挖掘 调度
Django后端架构开发:URLconf到ORM深度剖析
Django后端架构开发:URLconf到ORM深度剖析
55 1
|
3月前
|
数据库 Python
Django ORM
【8月更文挑战第23天】
43 4
|
3月前
|
API 数据库 开发者
【独家揭秘】Django ORM高手秘籍:如何玩转数据模型与数据库交互的艺术?
【8月更文挑战第31天】本文通过具体示例详细介绍了Django ORM的使用方法,包括数据模型设计与数据库操作的最佳实践。从创建应用和定义模型开始,逐步演示了查询、创建、更新和删除数据的全过程,并展示了关联查询与过滤的技巧,帮助开发者更高效地利用Django ORM构建和维护Web应用。通过这些基础概念和实践技巧,读者可以更好地掌握Django ORM,提升开发效率。
39 0
|
3月前
|
SQL Go 数据库
Django入门到放弃之ORM多表操作
Django入门到放弃之ORM多表操作
|
3月前
|
SQL 关系型数据库 MySQL
Django入门到放弃之ORM单表操作
Django入门到放弃之ORM单表操作
|
4月前
|
SQL 数据库 Python
Django框架数据库ORM查询操作(6)
【7月更文挑战第6天】```markdown Django ORM常用数据库操作:1) 查询所有数据2) 根据ID查询 3) 精确查询 4) 分页排序
72 1
|
5月前
|
存储 SQL 数据处理
Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解
Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解
|
SQL 数据库 索引
【Django学习】(六)ORM框架_关联模型_数据创建&查询&更新&删除&过滤
【Django学习】(六)ORM框架_关联模型_数据创建&查询&更新&删除&过滤
【Django学习】(六)ORM框架_关联模型_数据创建&查询&更新&删除&过滤