• 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'}]>
  • 相关阅读:
    Android——ListView学习笔记(一)
    记录笔记——关于request.getRequestDispatcher().forward(request, response)的跳转问题
    Python + openCV 实现图像垂直投影和水平投影
    2020年-第三周助教总结-第二组
    Python记录——字符串的常用方法
    2020年-第二周助教总结-第二组
    Android开发——三种活动跳转方式
    2020年-第一周助教总结-第二组
    Python —— 实例化ndarray对象
    海信聚好看矫恒浩:构建异地双活混合云,利用公共云应对流量突增
  • 原文地址:https://www.cnblogs.com/xiaoxiamiaichiyu/p/14789071.html
Copyright © 2020-2023  润新知