能否用Django-graphene实现指定树形结构输出?类定义求解
使用Django-Graphene实现树形菜单结构输出
完全可以用Django-Graphene实现这种无限层级的树形结构输出,下面是具体实现步骤:
1. 定义Django模型
首先需要一个支持层级关系的Page模型,通过自关联外键实现父子结构:
# models.py from django.db import models class Page(models.Model): parent = models.ForeignKey( 'self', on_delete=models.CASCADE, null=True, blank=True, related_name='children' # 用于反向查询子节点 ) page_slug = models.SlugField(unique=True) page_title = models.CharField(max_length=255) def __str__(self): return self.page_title
2. 定义Graphene类型与查询
核心是递归定义children字段,通过延迟引用自身类型解决循环依赖问题:
# schema.py import graphene from graphene_django import DjangoObjectType from .models import Page class PageType(DjangoObjectType): # 用lambda延迟引用PageType,避免类定义时的循环引用 children = graphene.List(lambda: PageType) class Meta: model = Page fields = ('page_slug', 'page_title') def resolve_children(self, info): # 从模型的related_name获取当前节点的所有子节点 return self.children.all() class Query(graphene.ObjectType): # 定义查询顶级菜单的字段 main_menu = graphene.List(PageType) def resolve_main_menu(self, info): # 返回所有父节点为空的顶级页面 return Page.objects.filter(parent__isnull=True) schema = graphene.Schema(query=Query)
3. 测试GraphQL查询
通过以下查询语句可以获取你需要的树形结构:
query GetMainMenu { mainMenu { pageSlug pageTitle children { pageSlug pageTitle children { pageSlug pageTitle # 支持无限嵌套查询子节点 } } } }
输出结果会和你提供的JSON结构一致,自动支持任意层级的子节点嵌套。
内容的提问来源于stack exchange,提问作者vladver
相关产品推荐
相关产品推荐

