zoukankan      html  css  js  c++  java
  • 06.F()和Q()查询

    01.F()

    • F() ---- 专门取对象中某列值的操作
    • **作用:**F()允许Django在未实际链接数据的情况下具有对数据库字段的值的引用
    from django.shortcuts import HttpResponse
    from app01 import models
    from django.db.models import F,Q
    
    def orm(request):
        # 每访问一次数据库中zhangsan的年纪就会自动增加1
        models.Student.objects.filter(name='zhangsan').update(age=F("age") + 1)
        return HttpResponse('orm')

    02.Q()

    2.1 Q查询基本使用

    • 1、Q对象(django.db.models.Q)可以对关键字参数进行封装,从而更好地应用多个查询
    • 2、可以组合使用 &(and),|(or),~(not)操作符,当一个操作符用于两个Q的对象,它产生一个新的Q对象
    • 3、如: Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')
    from django.shortcuts import HttpResponse
    from app01 import models
    from django.db.models import F,Q
    
    def orm(request):
        # 查找学生表中年级大于1小于30姓zhang的所有学生
        stus = models.Student.objects.filter(
            Q(age__gt=1) & Q(age__lt=30),
            Q(name__startswith='zhang')
        )
        print('stu',stus)   #运行结果:[<Student: zhangsan>]
        return HttpResponse('orm')


    2.2 动态添加查询条件

    • 动态添加多个and和or查询条件

     

    2.2.1 项目中动态添加or查询条件

     

    def table_search(request,admin_class,object_list):
       search_key = request.GET.get('_q','')
       q_obj = Q()
       q_obj.connector = 'OR'
       for column in admin_class.search_fields:
          q_obj.children.append(('%s__contains'%column,search_key))
       res = object_list.filter(q_obj)
       return res

     


    2.2.2 or动态添加多个查询条件

     

    # or动态添加多个查询条件
    >>> from crm import models
    >>> from django.db.models import Q
    >>> con = Q()                                   #1. 实例化一个Q()查询类
    >>> con.connector = "OR"                           #2. 指定使用‘OR’条件
    >>> con.children.append(('qq__contains','123'))           #3. qq字段中包含‘123’
    >>> con.children.append(('name__contains','name0'))         #4. name字段中包含‘naem0’
    >>> con
    <Q: (OR: ('qq__contains', '123'), ('name__contains', 'name0'))>   
                                #5. 查找name字段中包含‘naem0’或qq字段包含‘123’的所有条目
    >>> models.Customer.objects.values('qq','name').filter(con)    

     


    2.2.3 and和or结合查询

     

    # and和or结合查询
    #1. 导入模块
    >>> from crm import models
    >>> from django.db.models import Q
    
    #2. q1:查询id=1或者id=2的所有条目  (or条件)
    >>> q1 = Q()
    >>> q1.connector = 'OR'
    >>> q1.children.append(('id',1))
    >>> q1.children.append(('id',2))
    
    #3. q2:查询id=1的所有条目  (or条件)
    >>> q2 = Q()
    >>> q2.connector = 'OR'
    >>> q2.children.append(('id',1))
    
    #4. con:结合q1和q2条件结果是查询id=1的所有条目     (结合q1,q2的and条件)
    >>> con = Q()
    >>> con.add(q1,'AND')
       <Q: (OR: ('id', 1), ('id', 2))>
    >>> con.add(q2,'AND')
       <Q: (AND: (OR: ('id', 1), ('id', 2)), ('id', 1))>
    >>> models.Customer.objects.values('qq','name').filter(con)
       <QuerySet [{'qq': '123456765432', 'name': 'haha'}]>
  • 相关阅读:
    python3-常用模块之openpyxl(1)
    测试团队的工作模式
    接口测试之HttpClient
    接口测试之PostMan
    接口测试之HTTP协议
    ant+jmeter安装配置
    数据库结构比较和结构迁移工具
    MS SQLServer表数据生成Insert语句
    MS SQLServer数据库结构及数据对比
    HTTP协议
  • 原文地址:https://www.cnblogs.com/xiaoxiamiaichiyu/p/14789071.html
Copyright © 2011-2022 走看看