且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Django-从缓存的查询填充模型实例相关字段

更新时间:2023-02-27 13:16:07

我管理过使其以这种方式工作,并用2个db调用填充整个树:

I managed to make it work this way and populate the whole tree with 2 db calls:

def populate_prefetch_cache(node, all_nodes):
    children = [child for child in all_nodes if child.parent_id==node.id]

    # will not have the attribute if no prefetch has been done
    if not hasattr(node, '_prefetched_objects_cache'):
        node._prefetched_objects_cache = {}

    # Key to using local data to populate a prefetch!
    node._prefetched_objects_cache['children'] = children
    node._prefetch_done = True

    for child in node.children.all():
        populate_prefetch_cache(child , all_nodes )


all_nodes = list(Node.objects.all())  # Hit database once
root_node = Node.objects.get(pk=my_node_id)  # Hit database once

# Does not hit the database and properly populates the children field
populate_prefetch_cache(root_node, all_nodes)

由于以下答案,我发现了 _prefetched_objects_cache 属性: Django:将对象添加到一个相关的集合中而不保存到数据库中

I discovered the _prefetched_objects_cache attribute thanks to this answer: Django: Adding objects to a related set without saving to DB