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

  • 相关阅读:
    Servlet细节
    https协议
    常用css缩写
    Servlet
    计算机编码总结
    java 中 finally 语句块的 深度解析 总结
    使用DIV之后 table何去何从
    http协议
    web开发基础
    js闭包之我见
  • 原文地址:https://www.cnblogs.com/george92/p/11290873.html
Copyright © 2020-2023  润新知