欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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")

Django ORM (四) annotate,F,Q 查询

# 查询 klvchen 出的书总价格
...
def data_oper(req):
    obj = book.objects.filter(authors__name="klvchen").aggregate(sum("price"))
    print(obj)
    return httpresponse("hello world")

Django ORM (四) annotate,F,Q 查询

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")

Django ORM (四) annotate,F,Q 查询

.....
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")

Django ORM (四) annotate,F,Q 查询

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")

Django ORM (四) annotate,F,Q 查询