- 统计每一本以
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")
访问测试,查看终端输出
- 统计不止一个作者的图书名称
# -*- 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")
- 访问测试,查看终端输出
- 根据一本图书作者数量的多少对查询集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")
访问测试,查看终端输出
- 查询各个作者出的书的总价格
# -*- 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")
- 访问测试,查看终端输出
三、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")
- 访问测试,查看终端输出
- 将每一本书的价格提高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")
访问测试,查看数据库信息,可以看到成功修改价格
四、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")
- 访问测试,查看终端输出
- 查询以
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")
访问测试,查看终端输出
- 查询出版日期是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")
访问测试,查看终端输出