Django 中 Models 的 F()和 Q()函数

本文介绍了Django ORM中F()对象和Q()对象的高级用法,包括如何使用F()对象进行原子性的数据库字段更新,以及如何利用Q()对象实现复杂的数据库查询,提升开发效率。

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

  1. F() ---- 专门取对象中某列值的操作
    F对象允许Django在未实际链接数据的情况下具有对数据库字段的值的引用。
    通常情况下我们在更新数据时需要先从数据库里将原数据取出后方在内存里,然后编辑某些属性,最后提交。
all = BookInfo.objects.filter(auth="小明")
for b in all:
    price = b.price
    b.price = price + 10
    b.save
    
# 使用F对象来计算
BookInfo.objects.filter(auth="小明").update(price=F("price")+10)
  1. Q() ---- 对对象的复杂查询
    Q对象是Django对model查询中所使用的关键字参数进行封装后的一个对象。
    Q对象可以通过 &(与)、 |(或)、 ~(非)运算来组合生成不同的Q对象,便于在查询操作中灵活地运用。
from django.db.models import Q
# 并且条件:与条件查询
models.User.objects.filter(条件1,条件2,条件n..)
models.User.objects.filter(Q(username='老王') & Q(userpass='admin'))

# 或者条件:或条件
models.User.objects.fliter(Q(username='老王') | Q(username='老李'))

# 取反条件
models.User.objects.filter(~Q(username='老王'))
models.User.objects.exclude(username='老王')
### Django 中 F() 函数的用法 在 Django 的查询集中,`F()` 表达式提供了一种方法来执行涉及数据库列的操作而无需将它们加载到内存中。这使得可以高效地更新字段值以及比较模型实例之间的字段。 #### 使用 `F()` 进行算术运算 通过使用 `F()` 可以轻松实现基于现有字段值得出新值并保存回数据库的功能。例如,在博客应用里增加文章阅读次数: ```python from django.db.models import F from blog.models import Article Article.objects.filter(id=article_id).update(views=F('views') + 1) ``` 此操作会直接向数据库发送一条 SQL 更新语句,而不是先获取对象再修改属性最后保存更改[^6]。 #### 避免竞争条件 利用 `F()` 来做增量或其他类型的计算有助于防止多个并发请求之间可能出现的竞争状态问题。因为这些变更是在数据库级别完成的,所以不会受到应用程序层面上可能发生的冲突影响。 #### 字段间赋值 除了简单的加减乘除外,还可以用于设置某个字段等于另一个字段的值: ```python Employee.objects.all().update(salary=F('base_salary')) ``` 这里假设员工表中有两个字段分别是 base_salary salary ,上述代码将会把所有记录里的 salary 设置成对应记录中的 base_salary 值[^7]。 #### 复杂表达式的构建 对于更复杂的场景,比如需要组合多种逻辑或数学运算时,则可以通过嵌套的方式来创建更加灵活强大的查询条件: ```python from datetime import timedelta from django.utils import timezone from events.models import Event Event.objects.filter( end_time__lt=F('start_time') + timedelta(hours=2), status='upcoming' ).exclude(start_time__gte=timezone.now()) ``` 这段代码查找那些预计持续时间少于两小时且尚未开始即将举行的活动事件[^8]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值