首页 > 解决方案 > 如何在一个查询中获取所有对象子对象?

问题描述

我有一个人物模型。每个人都有自己的孩子。孩子也可能有孩子。我想在一个查询中获取所有孩子(递归)。我怎样才能做到这一点?

class Person(models.Model):
    name = models.CharField(max_length=40)
    parent = models.ForeignKey('self', null=True, blank=True, related_name='children')

    def __str__(self):
        return self.name

def add_person(request):
    if(request.method == 'POST'):
        name = request.POST['name']
        parent_id = request.POST.get('parent_id')
        person = Person(name=name, parent_id=parent_id)
        person.save()

        return redirect('/persons')
    else:
        return render(request, 'add_person.html')

标签: pythondjangopython-3.xdjango-1.11

解决方案


您可以使用prefetch_related

Person.objects.all().prefetch_related('children')

它有什么作用?如文档中所述,它将:

在单个批次中自动检索每个指定查找的相关对象。

它会获取您想要的日期,并且还会保存一些数据库 i/o。

按名称过滤:

Person.objects.filter(name='Vladislav').prefetch_related('children') 

推荐阅读