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

目录
相关文章
|
6月前
|
SQL 关系型数据库 MySQL
Django入门ORM(Django操作MySQL) 专题一
Django入门ORM(Django操作MySQL) 专题一
|
7月前
|
存储 数据可视化 数据库
Django创建应用、ORM的进阶使用及模型类数据库迁移3
Django创建应用、ORM的进阶使用及模型类数据库迁移3
52 0
|
7月前
|
关系型数据库 MySQL 数据库
Django创建应用、ORM的进阶使用及模型类数据库迁移2
Django创建应用、ORM的进阶使用及模型类数据库迁移2
48 0
|
4月前
|
SQL 数据库 开发者
Python Web 开发: 什么是 Django ORM?如何使用它进行数据库操作?
Python Web 开发: 什么是 Django ORM?如何使用它进行数据库操作?
|
1月前
|
SQL API 数据库
一篇文章带你了解Django ORM操作
一篇文章带你了解Django ORM操作
20 0
|
5月前
|
SQL 缓存 数据库
10 Django模型 - 模型查询
10 Django模型 - 模型查询
41 0
|
5月前
|
SQL 关系型数据库 MySQL
07 Django模型 - ORM简介及MySQL数据库的使用
07 Django模型 - ORM简介及MySQL数据库的使用
36 0
|
4月前
|
Python
django orm 批量更新不同内容
网上存在很多相似文章,都是使用drf-extension,但是这个包其实只是批量更新的一种方法,就是全部更新一个内容,这完全不符合自己的需求。
25 1
|
7月前
|
SQL 存储 API
Django ORM详解:最全面的数据库处理指南
Django ORM详解:最全面的数据库处理指南
46 0
|
7月前
|
缓存 数据库 Python
django这些查询技巧你会了吗?
django这些查询技巧你会了吗?