Google app engine NDB模型是否在事务后调用了post\U delete\U钩子?或者在删除其引用实体时从blobstore中清除blob的最佳方法

Google app engine NDB模型是否在事务后调用了post\U delete\U钩子?或者在删除其引用实体时从blobstore中清除blob的最佳方法,google-app-engine,blobstore,app-engine-ndb,Google App Engine,Blobstore,App Engine Ndb,我正在实现一个文件存储系统,其中多人可以共享上载到blobstore的文件,但一旦他们都删除了该文件,该文件就会从blobstore中删除 我使用引用计数实体进行此操作,当其计数设置为0时,该实体将被删除。我还使用了google.appengine.ext.ndb.blobstore中定义的BlobInfos ndb模型,因为我需要在几个点上获得一组BlobInfos,并且希望能够异步地完成这项工作 删除引用计数实体时,将调用它的_post_delete_hook方法,我使用BlobKey调用b

我正在实现一个文件存储系统,其中多人可以共享上载到blobstore的文件,但一旦他们都删除了该文件,该文件就会从blobstore中删除

我使用引用计数实体进行此操作,当其计数设置为0时,该实体将被删除。我还使用了
google.appengine.ext.ndb.blobstore
中定义的BlobInfos ndb模型,因为我需要在几个点上获得一组BlobInfos,并且希望能够异步地完成这项工作

删除引用计数实体时,将调用它的_post_delete_hook方法,我使用BlobKey调用blobstore.delete_async,它还调用ndb BlobInfo实例上的BlobInfo._key.delete_async()

class FileCounter(ndb.Model):
    count = ndb.IntegerProperty(default=1)
    @classmethod
    def _post_delete_hook(cls, key, future):
        blob_key = cls.blob_key_for_key(key)
        blobinfo_extension.delete(blobstore.BlobInfo.get(blob_key))
而blobinfo_extension.delete定义为:

@ndb.tasklet
def delete_async(blobinfo):
""" Delete both the blob info and the blob in the blobstore it refers to. """
    yield blobstore.delete_async(blobinfo.key()), blobinfo._key.delete_async()

def delete(blobinfo):
    delete_async(blobinfo).wait()
我获取count实体,递减其计数,然后检查它是否为0。如果为0,则会将其删除。这都是在一个事务中完成的。是否在事务外部调用了_post_delete_hook方法?如您所见,它正在访问BlobInfo实体并删除需要跨组事务的实体

我打算试试这个,看看它是否有效,但我把它贴在这里,因为找不到任何答案,所以它可能会在将来帮助其他人


这是解决这个问题的好方法,还是应该在计数减少时“手动”清理blobstore/blobinfo?我想我可能是在滥用post delete钩子

也许您可以使用
ndb.get\u context().在提交时调用\u()
在事务提交时执行一些工作?您可以将其与常规的_post _delete _钩子结合使用,该钩子只为提交后清理步骤添加实体。

谢谢,我想这正是我需要的!