更新时间: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