Django ORM (四) annotate,F,Q 查询
程序员文章站
2022-03-07 10:10:47
annotate 可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合。 F查询 F 使用查询条件的值,专门取对象中某列值的操作 Q 查询 Q 构建搜索条件 Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面 ......
annotate
可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合。
from django.shortcuts import render, httpresponse from app01 import models from app01.models import book,author,publisher from django.db.models import avg,min,sum,max def data_oper(req): # 查询每个出版社书的总价 obj = models.book.objects.values("publisher__name").annotate(sum("price")) print(obj) return httpresponse("hello world")
# 查询 klvchen 出的书总价格 ... def data_oper(req): obj = book.objects.filter(authors__name="klvchen").aggregate(sum("price")) print(obj) return httpresponse("hello world")
f查询
f 使用查询条件的值,专门取对象中某列值的操作
from django.shortcuts import render, httpresponse from app01 import models from app01.models import book,author,publisher from django.db.models import avg,min,sum,max from django.db.models import f # 书籍的价格都加20 def data_oper(req): models.book.objects.all().update(price=f("price")+20) return httpresponse("hello world")
q 查询
q 构建搜索条件
from django.shortcuts import render, httpresponse from app01 import models from app01.models import book,author,publisher from django.db.models import avg,min,sum,max from django.db.models import f,q from django.db.models import f,q # 查询 book 表 id 为3的书名,这里书名是因为在 models.py 定义的 class book 里面 __str__ 返回的是 title 字段 def data_oper(req): obj = models.book.objects.filter(q(id=3))[0] print(obj) return httpresponse("hello world")
..... from django.db.models import f,q # 查询 book 表 id为3或者 title 为 go 的记录 def data_oper(req): obj = models.book.objects.filter(q(id=3)|q(title="go")) print(obj) return httpresponse("hello world")
q对象可以与关键字参数查询一起使用,不过一定要把q对象放在关键字参数查询的前面
from django.db.models import f,q def data_oper(req): obj = models.book.objects.filter(q(price__gt=50)&(q(id=3)|q(title="php")), publisher_id=1) print(obj) return httpresponse("hello world")