ORM之F和Q操作
F操作:在更新时取到原来的值
from django.db.models import F
from django.db.models import F models.UserInfo.objects.all().update(age=F("age")+1) #这样就可以使age字段都加一,这样就可以获取原来的值然后加一或减一操作
字典类型的:
from django.db.models import F models.UserInfo.objects.filter(id=1,name="root") #这是 and 操作,两个条件是and关系 #但是条件里也可以加字典类型 condition = { "id":1, "name":"root", } models.UserInfo.objects.filter(**condition) #这样写字典也是支持查找的,但是这样也是 and的关系
Q操作:用于构造复杂查询条件的
Q是解决一些查询的问题
from django.db.models import Q
#Q操作可以实现 或(|) 和 and(&) 操作。也多条件的时候,加多加Q对象 models.UserInfo.objects.filter(Q(id=1)) models.UserInfo.objects.filter(Q(id=1)|Q(id=5)) models.UserInfo.objects.filter(Q(id=1)&Q(id=5))
Q 的多条件可以实现在多条件选择,比如在CMDB中,可以用于实现资产管理的多条件添加操作:用于组合筛选
q1 = Q() q1.connector = "OR" #q1 的每个条件都有OR操作 q1.children.append(("id",1)) q1.children.append(("id",10)) q1.children.append(("id",6)) q2 = Q() q2.connector = "OR" #q2 的每个条件都有OR操作 q2.children.append(("c1",1)) q2.children.append(("c2",10)) q2.children.append(("c3",6)) #q1 和 q2是两个单独的两个Q对象,每个里面都有OR条件 con = Q() con.add(q1,"AND") con.add(q2,"AND") #通过con的Q对象将q1和q2都加到con里,q1和q2是AND条件 #这样q1和q2是通过AND连接,而q1和q2内部是通过OR连接 #如同:(id=1 or id=10 or id=6)and (c1=1 or c1=10 or c1=6) #而Q里面还可以嵌套Q q3 = Q() q3.connector = "AND" q3.children.append(("n1",1)) q3.children.append(("n2",10)) q3.children.append(("n3",6)) q1.add(q3,"OR") #把q3加到q1里面去并加上q1的条件 #如同:(id=1 or id=10 or id=6 or (n1=1 and n2=10 and n3=6))and (c1=1 or c1=10 or c1=6)
用for循环是实现这个添加操作:
condition_dict = { "k1":[1,2,3,4], "k2":[1,], "k3":[11,] } con = Q() for k,v in condition_dict(): q=Q() q.connector = "OR" for i in v: q.children.append(("id",i)) con.add(q,"AND") #最后去数据库查的时候,直接写条件filter的con就可以了 con_list = models.UserInfo.objects.filter(con)
--------- END --------