Django中F查询及Q查询应用

本文介绍了Django ORM中F和Q查询的高级应用,包括批量更新商品价格及复杂条件筛选,展示了如何利用F和Q简化数据库操作。

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

当一般的查询语句已经无法满足我们的需求时,Django为我们提供了F和Q复杂查询语句。假设场景一:老板说对数据库中所有的商品,在原价格的基础上涨价10元,你该怎么做?场景二:我要查询一个名字叫xxx,年龄是18岁,或者名字是yyy,年龄是是19岁的人,你该怎么写你的ORM语句

一、F查询 


from django.db.models import F
from app01.models import Book

Book.objects.update(price=F("price")+20)  # 对于book表中每本书的价格都在原价格的基础上增加20元

就这样一条简单的语句就完成了对表中所有商品价格的更新,是不是很方便!如果没有F查询,你首先要获取原价格,再做一个算术运算,然后更新字段。F查询专门对对象中某列值的操作,不可使用__双下划线!

 

二、Q查询


Q查询可以组合使用 “&”, “|” 操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象,Q对象可以用 “~” 操作符放在前面表示否定,也可允许否定与不否定形式的组合。Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。

from django.db.models import Q

print(Book.objects.filter(Q(id=3))[0])  # 因为获取的结果是一个QuerySet,所以使用下标的方式获取结果
print(Book.objects.filter(Q(id=3)|Q(title="Go"))[0])  # 查询id=3或者标题是“Go”的书
print(Book.objects.filter(Q(price__gte=70)&Q(title__startswith="J")))  # 查询价格大于等于70并且标题是“J”开头的书
print(Book.objects.filter(Q(title__startswith="J") & ~Q(id=3)))  # 查询标题是“J”开头并且id不是3的书
print(Book.objects.filter(Q(price=70)|Q(title="Python"), publication_date="2017-09-26"))  # Q对象可以与关键字参数查询一起使用,必须把普通关键字查询放到Q对象查询的后面
from django.db.models import Q

con = Q()
q1 = Q()
q1.connector = "AND"
q1.children.append(("email", "123@qq.com"))
q1.children.append(("password", "abc123"))

q2 = Q()
q2.connector = "AND"
q2.children.append(("username", "abc"))
q2.children.append(("password", "xyz123"))

con.add(q1, "OR")
con.add(q2, "OR")

obj = models.UserInfo.objects.filter(con).first()

# 查询email=123@qq.com和password=abc123 或者 username=abc和password=xyz123的用户信息

上面的例子就是一个典型的复杂查询,通过将Q对象实例化来然后增加各个条件之间的关系,而且这种写法用在你不知道用户到底会传入多少个参数的时候很方便!

以上就是通过两个小例子对Q查询和F查询的应用做一个简单的记录,更多查询的用法和API可以查阅Django的官方文档:https://docs.djangoproject.com/zh-hans/2.0/topics/db/queries/

### Django 中 F 表达式 Q 对象的使用 #### F 表达式简介 Django 提供了一种称为 `F()` 表达式的工具,用于引用数据库中的字段值并执行基于这些值的操作。`F()` 表达式允许你在查询中直接操作数据库列而无需加载数据到内存中[^5]。 以下是几个常见的用法: ```python from django.db.models import F from myapp.models import MyModel # 增加某个字段的值 MyModel.objects.update(counter=F('counter') + 1) # 查询条件比较两个字段 MyModel.objects.filter(field1__gt=F('field2')) ``` 上述代码展示了如何通过 `F()` 来更新记录以及在过滤器中进行跨字段比较[^5]。 --- #### Q 对象简介 当需要构建复杂的查询条件时,可以使用 `Q` 对象来组合多个过滤条件。`Q` 对象支持逻辑运算符(如 AND、OR NOT),从而实现更灵活的查询需求[^6]。 下面是一些典型的例子: ```python from django.db.models import Q from myapp.models import MyModel # OR 运算 results = MyModel.objects.filter(Q(name='Alice') | Q(age=30)) # AND 运算 results = MyModel.objects.filter(Q(name='Bob'), Q(city='New York')) # NOT 运算 results = MyModel.objects.exclude(~Q(email__endswith='.com')) ``` 以上示例说明了如何利用 `Q` 对象创建复杂查询语句,包括布尔逻辑运算的支持[^6]。 --- #### 结合 F Q 的高级场景 有时可能需要同时使用 `F` `Q` 实现更为精细的数据处理。例如,在筛选的同时修改某些字段值: ```python from django.db.models import F, Q # 更新符合条件的对象,并设置新值 MyModel.objects.filter( Q(price__lt=100) & ~Q(stock_count=0) ).update(discounted_price=F('price') * 0.9) ``` 此片段演示了一个综合案例:先定义一组复合条件 (价格低于 100 且库存不为零),再对满足该条件的目标应用折扣计算[^7]。 --- #### 总结 无论是单独运用还是联合调用,`F` 表达式与 `Q` 对象都极大地增强了 Django ORM 的功能性灵活性。它们不仅简化了许多原本繁琐的任务流程,还优化了性能表现——因为所有操作均是在 SQL 层面完成而非 Python 环境下迭代处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlexGeek

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值