Python数据库查询之组合条件查询-F&Q查询

小说:怎么和我人生的部分情形惊人相似?作者:丁乙龙更新时间:2019-03-21字数:12538

F查询(取字段的值)

关于查询我们知道有filter( ) ,values( ) , get( ) ,exclude( ) ,如果是聚合分组,还会用到aggregate和annotate,甚至还有万能的双下划线,但是如果有这样一个需求,查询a表中的aa字段数值大于b表中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()返回的结果不一定是数字,也可以是字符串,比如

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=1000))

 

延伸:

因为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)

 

当前文章:http://leetaemin.cn/news/201901/26/content_98915.html

发布时间:2019-03-21 16:50:58

高考之后做什么? 新娘眉毛的画法技巧分析 打造自然美丽新娘 超常儿童的幼小衔接之路 没有爸,妈又不喜欢,丈夫还发脾气骂人。我该怎么办? 董卿为什么没有被狐狸狗催眠? 家长“说教”是怎样毁人不倦的? 如何用一个小故事成功吸引妹子 路为纸,地成册。行作笔,心当墨 罗李华大师教你学习易经 随喜放生、功德无量,消灾纳福、转危为安

77236 79127 90652 88400 64614 93413 93231 37644 85313 81178 15927 40657 77914 75009 29320 42697 95084 27052 71794 20200 69264 87691 32146

我要说两句: (0人参与)

发布