python进行数据查询_Python数据库查询之组合条件查询-F&Q查询

F查询(取字段的值)

关于查询我们知道有filter( ) ,values( ) , get( ) ,exclude( ) ,如果是聚合分组,还会用到aggregate和annotate,甚至还有万能的双下划线,但是如果有这样一个需求,查询a表中的aa字段数值大于a表中bb字段数值,应该怎么做呢,Django提供一个F表达式来支持这种操作

首先应该导入模块:

from django.db.models import F

a.objects.filter(aa__gt=F('bb'))

再举一个简单的例子,修改表中的值,为每一个a表中的price字段的值,加20

a.objects.all().update(price=F('price')+20)

如果没有F 对象,这种需求是无法实现的

Django支持对F()对象进行加、减、乘、除、取模、幂计算等操作

F()括号中还支持双下划线进行连表查询,F()返回的结果不一定是数字,也可以是字符串,比如,a和b是两张表

from django.db.models import F

a.objects.filter(name=F('b__name'))

Q查询,相比F查询,Q组合查询应用十分广泛,甚至你的查询只需要一个filter和Q,就够了

需导入

from django.db.models import Q

本来filter( ) 方法中的关键字,都是按‘与’的关系进行查找的,如果你需要 ‘或’ 的关系,你就得用Q了

Q对象用于封装一组关键字参数,这些关键字参数就可以作为filter()的参数

重点是Q对象可以使用 | 或者 & 连接成一个新的Q对象,还支持用 ~ 符号取反

需要注意:Q对象可以和其他关键字参数一起作为filter的参数,但是Q对象必须放在一个位置

示例:查询a表中id大于4,以‘张’开头,或者价格大于10000的数据

a.objects.filter((Q(name__startwith='张'),Q(id__gt=4))|Q(price__gt=10000))

延伸:

因为filter接收的参数是关键字参数,所以在实际项目应用中,我们可以单独处理这个关键字参数,比如写成一个字典dict,然后filter(**dict) 就可以应用我们写在字典中的参数了

如果是Q对象,就不用**了

用Q对象做字典的元素时,如果是‘或’的关系,需要这样写

con =Q()

con.connector= 'OR'key=......

val=.......

con.children.append((key,val))dict = {‘key2’:‘val2’}data_list = a.objects.filter(**dict).filter(con)  # 这句话表明了filter后面可以跟的参数,一个是字典,另一种就是Q 对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值