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

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)

原表:

【Django】一看就懂的数据库(ORM)F函数和Q函数_第1张图片

现表:

【Django】一看就懂的数据库(ORM)F函数和Q函数_第2张图片


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)

【Django】一看就懂的数据库(ORM)F函数和Q函数_第3张图片

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的组合查询条件

原表:

【Django】一看就懂的数据库(ORM)F函数和Q函数_第4张图片

查询结果:

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

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

你可能感兴趣的:(Python)