F查询和Q查询
当一般的查询已经无法满足我们的需求时,Django为我们提供了F和Q查询的复杂语句。假如,对数据库中所有人的年龄加一岁,该怎样查询?
F查询
F查询专门对对象中某列值的操作,不可使用_双下划线!
Q查询
Q()可以使orm的fifter()方法支持, 多个查询条件,使用逻辑关系(&、|、~)包含、组合到一起进行多条件查询
Q查询可以组合使用“&”,“|”操作符,当一个操作符是用两个Q的对象,他产生了一个新的Q对象,Q对象可以用“~”操作符放在前面表示否定
也可允许否定与不否定形式的组合。Q对象可以与关键字参数查询一起使用,不过一定要把Q对象放在关键字参数查询的前面。
语法:
fifter(Q(查询条件1)| Q(查询条件2))
fifter(Q(查询条件2)& Q(查询条件3))
fifter(Q(查询条件4)& ~Q(查询条件5))
fifter(Q(查询条件6)| Q(Q(查询条件4)& ~ Q(Q(查询条件5)& Q(查询条件3)))包含
Q查询和非Q查询条件混合使用注意,不包括Q()的查询条件一点要放在Q(查询条件)后面
分组和聚合查询
1、aggregate(*args,**kwargs) 聚合函数
通过对QuerySet进行计算,返回一个聚合值的字典。aggregate()中每一个参数都指定一个包含在字典中的返回值。即在查询集上生成聚合。
2、annotate(*args,**kwargs) 分组函数
extra
extra针对的是复杂的SQL语句
select select_params
1 v = models.UserInfo.objects.all().extra(select={ 2 'n': "select count(1) from app01_userinfo WHERE id>%s" 3 }, 4 select_params=[1,] # 有多个% 内部就有多个参数 5 ) 6 print(v) 7 for item in v: 8 print(item.id,item.name,item.n) # 这里使用n
where params
1 models.UserInfo.objects.extra( 2 where=["id=1","name='aaa'"] 3 ) 4 models.UserInfo.objects.extra( 5 where=["id=1 or id=%s ","name=%s"], 6 params=[1,"aaa"] 7 )
tables
1 models.UserInfo.objects.extra( 2 tables=['app01_usertype'], 3 ) 4 # """select * from app01_userinfo,app01_usertype"""
总结:
1 # a. 映射 2 # select 3 # select_params=None 4 # select 此处 from 表 5 6 # b. 条件 7 # where=None 8 # params=None, 9 # select * from 表 where 此处 10 11 # c. 表 12 # tables 13 # select * from 表,此处 14 15 # c. 排序 16 # order_by=None 17 # select * from 表 order by 此处
原生SQL
Django内部提供了写原生SQL的方法
在setting中配置
connection.cursor()默认是default数据
cursor=connection['db2'].cursor()可以定义自己的数据库
1 from django.db import connection, connections 2 3 cursor = connection.cursor() #默认 connection=default数据库 4 cursor = connections['db2'].cursor() 5 6 cursor.execute("""SELECT * from auth_user where id = %s""", [1])# 写原生SQL 7 8 row = cursor.fetchone() 9 row = cursor.fetchall()