Django:通过查询相关模型创建嵌套字典的最有效方法?

Django:通过查询相关模型创建嵌套字典的最有效方法?,django,dictionary,django-queryset,django-orm,Django,Dictionary,Django Queryset,Django Orm,在Django中,通过查询相关模型和子模型来创建嵌套数据字典的最有效方法是什么 例如,如果我有以下型号: 母公司 孩子们 宠物 我看过django的方法,这很酷,所以我想我可以循环每个级别的queryset,在每个级别上为每个实例创建一组DB调用,但是有更好的方法吗 例如,“预回迁相关”是否可以用于获取所有三层,就像用于获取两层一样 让字典看起来像这样会很好: [ { "name": "Peter Parent", "children": [ {

在Django中,通过查询相关模型和子模型来创建嵌套数据字典的最有效方法是什么

例如,如果我有以下型号:

  • 母公司
    • 孩子们
      • 宠物
我看过django的方法,这很酷,所以我想我可以循环每个级别的queryset,在每个级别上为每个实例创建一组DB调用,但是有更好的方法吗

例如,“预回迁相关”是否可以用于获取所有三层,就像用于获取两层一样

让字典看起来像这样会很好:

[
  {
    "name": "Peter Parent",
    "children": [
      {
        "name": "Chaden Child",
        "pets": [
          {
            "name": "Fanny",
            "type:": "fish"
          },
          {
            "name": "Buster",
            "type:": "bunny"
          }
        ]
      },
      {
        "name": "Charlete Child",
        "pets": [
          {
            "name": "Dandy",
            "type:": "dog"
          }
        ]
      }
    ]
  }
]
编辑: 根据要求,这是模型的外观:

class Pet(models.Model):
    name = models.CharField(max_length=50)
    type = models.CharField(max_length=50)

    def __str__(self):
        return self.name

class Child(models.Model):
    name = models.CharField(max_length=50)
    pets = models.ManyToManyField(Pet)

    def __str__(self):
        return self.name

class Parent(models.Model):
    name = models.CharField(max_length=50)
    children = models.ManyToManyField(Child)

    def __str__(self):
        return self.name
SELECT pa.name, ch.name, pe.name, pe.type
FROM aarc_parent pa
JOIN aarc_parent_children pc ON pc.parent_id = pa.id
JOIN aarc_child ch ON ch.id = pc.child_id
JOIN aarc_child_pets cp ON cp.child_id = ch.id
JOIN aarc_pet pe ON pe.id = cp.pet_id
这就是原始sql的样子:

class Pet(models.Model):
    name = models.CharField(max_length=50)
    type = models.CharField(max_length=50)

    def __str__(self):
        return self.name

class Child(models.Model):
    name = models.CharField(max_length=50)
    pets = models.ManyToManyField(Pet)

    def __str__(self):
        return self.name

class Parent(models.Model):
    name = models.CharField(max_length=50)
    children = models.ManyToManyField(Child)

    def __str__(self):
        return self.name
SELECT pa.name, ch.name, pe.name, pe.type
FROM aarc_parent pa
JOIN aarc_parent_children pc ON pc.parent_id = pa.id
JOIN aarc_child ch ON ch.id = pc.child_id
JOIN aarc_child_pets cp ON cp.child_id = ch.id
JOIN aarc_pet pe ON pe.id = cp.pet_id

您可以使用
预回迁\u related
以及列表理解
prefetch_related
将有助于避免每次访问相关对象时进行额外查询

parents = Parent.objects.all().prefetch_related('children__pets')

[{'name': parent.name, 'children': [{'name': child.name, 'pets': [{'name':pet.name, 'type':pet.type} for pet in child.pets.all()]} for child in parent.children.all()]} for parent in parents]

请为模型添加代码。@RahulGupta:谢谢Rahul,我添加了模型代码。谢谢Rahul的回答。在测试它时,我得到了以下错误:AttributeError:在父对象上找不到'childs','childs\uuuu pets'是一个无效的参数,用于预取\u相关()请尝试使用
children\uu pets
。哈,我正要发布“children\u pets”有效的消息。谢谢你的帮助,拉胡尔,这就是我需要的!