【发布时间】:2016-10-04 06:10:30
【问题描述】:
在 Django 中,通过查询相关模型和子模型创建嵌套数据字典的最有效方法是什么?
例如,如果我有以下型号:
- 父母
- 儿童
- 宠物
- 儿童
我看过 django 的 model_to_dict 方法,这很酷,所以我想我可以循环遍历每个级别的查询集并为每个实例在每个级别上创建一堆数据库调用,但是有更好的方法吗?
例如,“prefetch_related”是否可以用于获取所有三层,因为它用于获取两层here?
让字典看起来像这样会很棒:
[
{
"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
这就是原始 sql 的样子:
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
【问题讨论】:
-
请添加型号的代码。
-
@RahulGupta:谢谢 Rahul,我添加了模型代码。
标签: django dictionary django-queryset django-orm