F函数
主要用于获取字段当前的值
场景:假如有表,表有字段age,我想把所有age都自增1,该如何做?
SQL语句:update 表名 set age=age+1
若用ORM该如何操作?
# F()的用法(用于获取字段原来的值)from django.db.models import Fresult = 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函数适用于多种筛选条件嵌套的情形,可以进行组合查询,其可应用于网站的高级检索功能的实现。
如果看懂了就请点个 赞,谢谢~