我正在研究Django,当时我发现他们正在链接他们的查询方法,如Post.objects.filter(pk=1).filter(title='first').filter(author='me')
来构造一个查询而不实际执行它,并且只在我们尝试访问并使用它的结果时才执行查询。
从那里我有兴趣知道他们是如何做到这一点所以我可以在我的工作中应用相同的方法,所以例如我可以有类似的东西
myProduct.discount('10%').discountLimit('100$').tax('10$').shipping('20$')
之类的代码只会在我尝试使用它时进行评估。为非Django应用构建自定义数据库管理器,我可以链接我的查询方法并仅在我尝试访问其结果时自动执行查询(或者至少在链接结束时)。所以我可以用
之类的东西结束#doesn't hit the DB
myPost = Post.objects.select(...).where(...).where(...).limit(...)
#only hit the DB on usage
print(myPost.title)
所以我的问题是,我该怎么办?
我想到的方法,但我不喜欢
我可以实现一个.execute()方法来执行实际执行,在链的尾部或需要时调用它Post.objects.select(x).where(y).offset(z).execute()
我可以在每个查询构建器方法中插入一个延迟,以确保它是链中的最后一个
class Post:
def where(self,...):
me = now()
self.lastCall = me
#process the inputs here
self.query += "WHERE ..."
self.lazyExecute(me)
return self
def lazyExecute(self,identifier):
delay(5000)
if self.lastCall = identifier
self.executeQuery()
else:
pass