为了账号安全,请及时绑定邮箱和手机立即绑定

Python/Django递归模型到树结构字典

Python/Django递归模型到树结构字典

Cats萌萌 2023-02-22 15:23:21
我有一个 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)我想创建返回树结构字典的递归。例如[    {        'category_name': 'vehical',        'id': 1,        'children' : [            {                'category_name': 'cars',                'id': 11,                'children': [                    {                        'category_name': 'sport cars',                        'id': 20                    }                               ]                           }               ]    }]>>> category = Category.objects.all()>>> get_tree(category)
查看完整描述

1 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

我认为您需要将您的ForeignKey关系更改为self, 以引用自身。此外,为了简化实现,让我们添加related_name='children'( doc ) 并将其设为 nullable( null=True) 以将其表示为根节点。


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)


查看完整回答
反对 回复 2023-02-22
  • 1 回答
  • 0 关注
  • 193 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号