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

博客介绍了Python和PHP中的Annotate、F查询和Q查询。Annotate可计算查询结果中对象关联集合的总计值等,为查询集每一项生成聚合;F查询用于取对象中某列值;Q查询可构建搜索条件,且Q对象与关键字参数查询一起使用时要放前面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

1334255-20190527155717412-719100386.png

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

1334255-20190527160334615-968670271.png

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

1334255-20190527163820686-275741534.png

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

1334255-20190527164253177-1449705005.png

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

1334255-20190527165053142-1540765995.png

转载于:https://www.cnblogs.com/klvchen/p/10931143.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值