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'}]>
posted @ 2021-05-20 11:16  小虾米爱吃鱼  阅读(1028)  评论(0编辑  收藏  举报