【Django】一看就懂的数据库(ORM)F函数和Q函数

本文介绍了Django ORM中的F函数和Q函数。F函数用于根据字段当前值进行操作,例如更新所有记录的age字段加1。而Q函数则用于组合复杂筛选条件,例如选取id在特定范围或满足多个条件的数据。通过Q对象的连接操作,可以实现灵活的查询组合,适用于高级检索功能的实现。

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

F函数

主要用于获取字段当前的值

场景:假如有表,表有字段age,我想把所有age都自增1,该如何做?

SQL语句:update 表名 set age=age+1

若用ORM该如何操作?

# F()的用法(用于获取字段原来的值)
from django.db.models import F
result = models.UserInfo.objects.update(age=F('age')+1)
print(result)

原表:

现表:


Q函数

主要用于组合筛选条件

需求:假如有表,取表中id为(1,10)的数据

SQL: select * from 表名 where id>1 and id<10

ORM操作:

其中,&表示与、|表示或、~表示非

# Q的用法(用于组合筛选条件)
    # 用法一(逻辑非用‘~’代替)
    from django.db.models import Q
    results = models.UserInfo.objects.filter(Q(id__gt=1) & Q(id__lt=10))
    # results = models.UserInfo.objects.filter(Q(id=1) | Q(id=2))
    for row in results:
        print(row.id,row.username,row.age)

Q函数还可用于复杂的条件组合。

需求:假如有表,表有字段id、age、ug_id,现取ug_id为1-3且age>20的数据

SQL:select * from 表名 where (age > 20) and (ug_id=1 or ug_id=2 or ug_id=3)

ORM操作:

    # 用法二
    inner1 = Q()
    inner1.connector = 'OR'
    inner1.children.append(('ug_id', 1))
    inner1.children.append(('ug_id', 2))
    inner1.children.append(('ug_id', 3))

    inner2 = Q()
    inner2.connector = 'AND'
    inner2.children.append(('age__gt', 20))
    
    # 将子条件inner1和inner2组合
    outer = Q()
    outer.connector = 'AND'
    outer.add(inner1, 'OR')
    outer.add(inner2, 'AND')

    results = models.UserInfo.objects.filter(outer)
    for row in results:
        print(row.id,row.username,row.age,row.ug_id)

创建Q对象,Q.connector设定查询逻辑,将查询条件添加至Q.children列表,然后将多个子条件用add进行组合,就会生成类似SQL的组合查询条件

原表:

查询结果:

总结:Q函数适用于多种筛选条件嵌套的情形,可以进行组合查询,其可应用于网站的高级检索功能的实现。

如果看懂了就请点个 赞,谢谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值