ORM之F和Q操作

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 --------

原文地址:https://www.cnblogs.com/george92/p/11290873.html