gpt4 book ai didi

Django prefetch_related child 的 child

转载 作者:行者123 更新时间:2023-12-05 04:01:36 24 4
gpt4 key购买 nike

我有一个看起来像这样的模型 Node:

class Node(models.Model):
parent = models.ForeignKey('self', related_name='children', on_delete=models.CASCADE)

一个节点可以有多个子节点,每个子节点可以有自己的子节点。

如果我这样做:

def show_child(node):
for child in node.children.all():
show_child(child)

root_node = Node.objects.prefetch_related('children').get(pk=my_node_id) # hit database twice, as expected
print("Now testing queries")
root_node.children.all() # no hit
root_node.children.all() # no hit
root_node.children.all() # no hit
root_node.children.all() # no hit
print("Test 2")
show_child(root_node) # hit database for every loop except the first

每次我尝试访问 child 的 child 时,数据库都会受到影响。

我怎样才能让它在单个数据库查询中获取节点、它的子节点、它的子节点的子节点等等?

最佳答案

根据docs你可以这样做:

Restaurant.objects.prefetch_related('pizzas__toppings')

这将预取属于餐厅的所有比萨饼,以及属于这些比萨饼的所有浇头。这将导致总共 3 个数据库查询 - 一个用于餐厅,一个用于比萨饼,一个用于配料。

或者您可以使用 Prefetch 对象来进一步控制预取操作。

from django.db.models import Prefetch

Restaurant.objects.prefetch_related(Prefetch('pizzas__toppings', queryset=Toppings.objects.order_by('name')))

关于Django prefetch_related child 的 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55201573/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com