您现在的位置是:亿华云 > 系统运维
一日一技:在Python里面实现链式调用
亿华云2025-10-08 20:51:41【系统运维】8人已围观
简介我们在使用Django的models查询数据库时,可以看到有这种写法:formapp.modelsimportXXXquery=XXX.objects.all()query=query.filter(
我们在使用Django的日技models查询数据库时,可以看到有这种写法:
form app.models import XXX query = XXX.objects.all() query = query.filter(name=123,面链式 age=456).filter(salary=999)在这种写法里面,query对象有一个filter方法,实现这个方法的调用返回数据还可以继续调用filter方法,可以这样无限制地调用下去。日技
这种写法是面链式怎么实现的呢?
如果我们直接写一个类的方法,看看能不能这样调用:
class Query: def filter(self): pass query = Query() query.filter().filter()直接对query.filter()返回的实现结果再调用一次filter,就会导致报错了。调用这是日技因为在没有显式写return语句的时候,方法会返回None,面链式而None对象是实现没有所谓的filter方法的。
那么什么东西有filter方法呢?调用显然我们的query对象有filter方法。那么如何让这个方法返回自身这个对象呢?日技
这个时候,高防服务器我们就要看看我们在定义类方法的面链式时候,总会写的实现的第一个参数self了。几乎每个类方法里面都会有它。大家只知道在类里面调用类方法的时候可以用self.xxx(),在调用类属性的时候可以用self.yy,那么有没有思考过,这个东西如果单独使用会怎么样呢?
实际上,self指的就是这个类实例化成一个对象以后,这个对象自身。而这个对象显然是有filter方法的。所以我们修改一下filter方法,让它返回self:
class Query: def filter(self): return self query = Query() query.filter().filter()从图中可以看出,现在已经不会报错了。那么回到最开始的问题,云南idc服务商Django里面的链式调用传入查询参数是如何实现的呢?
实际上这里涉及到一个惰性查询的问题。
当我们不停调用.filter()方法的时候,Django会把这些查询条件全部缓存起来,只有当我们需要获取结果,或者查询满足条件的数据有多少条时,它才会真正地连接数据库去查询。
所以我们这里要模拟这个环境,把查询条件缓存起来。
那么为了获取调用方法时传入的参数名,我们就要使用**kwargs参数。这个参数可以接受所有的key=value形式的参数:
class Query(): def __init__(self): self.query_condition = { } def filter(self, **kwargs): self.query_condition.update(kwargs) return self query = Query() a = query.filter(name=kingname).filter(age__gt=15, address=yyyyyy).filter(salary=99999) print(query.query_condition)运行效果如下图所示:
在真正需要输出结果的时候,再使用这些缓存的条件,去数据库中查询结果即可。源码库
很赞哦!(8)
相关文章
- tk域名是什么域名?新手对tk域名有什么看法?
- 微软宣布以75亿美元收购GitHub 后者将保持独立开放
- 【WOT2018】大前端时代来临,H5和云端化如何破解开发难题?
- Spring的自定义Schema是如何解析生效的
- 域后缀首选.com,.net,然后是.cn。后缀选择不当,导致流量损失。域名是企业与互联网网址之间的链接,关键是企业在网络上存在的标志。因此,选择好域名是开展网上工作的首要重要条件。
- Spring Cloud构建微服务架构:分布式配置中心【Dalston版】
- 看了北上深三地Go语言薪资 终于明白为什么开发者选择使用它
- 11种编程字体中的哪款适合你?
- 互联网其实拼的也是人脉,域名投资也是一个时效性很强的东西,一个不起眼的消息就会引起整个域名投资市场的动荡,因此拓宽自己的人脉圈,完善自己的信息获取渠道,让自己能够掌握更为多样化的信息,这样才更有助于自己的域名投资。
- 码农跳槽指南:如何在新公司建立自己的“支配地位”?