Python/Django递归模型到树结构dict

Python/Django递归模型到树结构dict,python,django,Python,Django,我有一个Django模型 class Category(models.Model): parent = models.ForeignKey('Category', null=False, blank=False) category_name = models.CharField(max_length=55,null=False, blank=False) status = model.BooleanField(default=True) 我想创建递归的返回树结构dict

我有一个Django模型

class Category(models.Model):
    parent = models.ForeignKey('Category', null=False, blank=False)
    category_name = models.CharField(max_length=55,null=False, blank=False)
    status = model.BooleanField(default=True)
我想创建递归的返回树结构dict

e、 g


我认为您需要将您的
ForeignKey
关系更改为
self
,以便引用自身。此外,为了实现的简单性,让我们添加
相关的_name='children'
(),并使其可为null(
null=True
),以将其表示为根节点

然后我们可以执行以下实现:

from django.forms.models import model_to_dict

def get_tree(category):
    tree = model_to_dict(category, fields=['category_name', 'status', 'id'])
    if category.children.all().exists():
       children = list()
       for child in category.children.all():
          children.append(get_tree(child))
       tree['children'] = children
    return tree

final_tree = list()
for category in Category.objects.filter(parent__isnull=True):
    final_tree.append(get_tree(category))
print(final_tree)
class Category(models.Model):
    parent = models.ForeignKey('self', null=True, blank=True, related_name='children')
    category_name = models.CharField(max_length=55,null=False, blank=False)
    status = models.BooleanField(default=True)
from django.forms.models import model_to_dict

def get_tree(category):
    tree = model_to_dict(category, fields=['category_name', 'status', 'id'])
    if category.children.all().exists():
       children = list()
       for child in category.children.all():
          children.append(get_tree(child))
       tree['children'] = children
    return tree

final_tree = list()
for category in Category.objects.filter(parent__isnull=True):
    final_tree.append(get_tree(category))
print(final_tree)