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')
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 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')
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 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
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 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)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 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'}]>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
上次更新: 2024/3/13 15:35:10