###annotate 可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合。
1from django.shortcuts import render, HttpResponse 2from app01 import models 3from app01.models import Book,Author,Publisher 4from django.db.models import Avg,Min,Sum,Max 5 6def data_oper(req): 7 # 查询每个出版社书的总价 8 obj = models.Book.objects.values("publisher__name").annotate(Sum("price")) 9 print(obj) 10 return HttpResponse("Hello world")

1# 查询 klvchen 出的书总价格 2... 3def data_oper(req): 4 obj = Book.objects.filter(authors__name="klvchen").aggregate(Sum("price")) 5 print(obj) 6 return HttpResponse("Hello world")

###F查询 F 使用查询条件的值,专门取对象中某列值的操作
1from django.shortcuts import render, HttpResponse 2from app01 import models 3from app01.models import Book,Author,Publisher 4from django.db.models import Avg,Min,Sum,Max 5from django.db.models import F 6 7# 书籍的价格都加20 8def data_oper(req): 9 models.Book.objects.all().update(price=F("price")+20) 10 return HttpResponse("Hello world")
###Q 查询 Q 构建搜索条件
1from django.shortcuts import render, HttpResponse 2from app01 import models 3from app01.models import Book,Author,Publisher 4from django.db.models import Avg,Min,Sum,Max 5from django.db.models import F,Q 6from django.db.models import F,Q 7 8# 查询 book 表 id 为3的书名,这里书名是因为在 models.py 定义的 class Book 里面 __str__ 返回的是 title 字段 9def data_oper(req): 10 obj = models.Book.objects.filter(Q(id=3))[0] 11 print(obj) 12 return HttpResponse("Hello world")

1..... 2from django.db.models import F,Q 3 4# 查询 book 表 id为3或者 title 为 GO 的记录 5def data_oper(req): 6 obj = models.Book.objects.filter(Q(id=3)|Q(title="GO")) 7 print(obj) 8 return HttpResponse("Hello world")

Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面
1from django.db.models import F,Q 2 3def data_oper(req): 4 obj = models.Book.objects.filter(Q(price__gt=50)&(Q(id=3)|Q(title="php")), publisher_id=1) 5 print(obj) 6 return HttpResponse("Hello world")
