You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中创建嵌套模型?以Level与Question层级结构为例

如何在Django中实现Level与Question的嵌套模型结构

嘿,这个需求在Django里其实用模型的外键关联就能轻松搞定,咱们一步步来拆解实现:

1. 定义核心模型

首先在你的models.py文件里定义两个模型,用Django的ForeignKey来实现一对多的关联——一个Level可以包含多个Question,每个Question归属于唯一的Level。如果你的Level本身也需要层级延伸(比如父Level下有子Level),咱们也可以加上自关联的外键:

from django.db import models

class Level(models.Model):
    name = models.CharField(max_length=100, verbose_name="层级名称")
    # 可选:实现Level自身的层级嵌套(比如Level 1下有Level 1.1)
    parent_level = models.ForeignKey(
        'self',
        on_delete=models.CASCADE,
        null=True,
        blank=True,
        related_name='child_levels',
        verbose_name="父级层级"
    )

    def __str__(self):
        return self.name

class Question(models.Model):
    content = models.TextField(verbose_name="问题内容")
    # 关联到Level,每个Question属于一个Level
    level = models.ForeignKey(
        Level,
        on_delete=models.CASCADE,
        related_name='questions',
        verbose_name="所属层级"
    )

    def __str__(self):
        # 打印时显示层级+问题预览
        return f"{self.level.name} - {self.content[:50]}..."

2. 关键字段解释

  • Level的parent_level:这是可选字段,如果你的需求里Level本身有层级关系(比如一级Level下有二级Level),就保留它。related_name='child_levels'让你可以通过父Level直接获取所有子Level,比如parent_level.child_levels.all(),非常方便遍历层级。
  • Question的level:这个是核心关联字段,related_name='questions'允许你通过任意Level实例直接拿到它下面的所有Question,比如my_level.questions.all(),完美对应你要的“Level包含多个Question”的结构。

3. 怎么用这个模型?

创建数据的时候很直观:

  1. 创建顶级Level(如果不需要层级嵌套,直接创建就行):
level_1 = Level.objects.create(name="Level 1")
  1. 如果需要子Level:
sub_level_1 = Level.objects.create(name="Level 1.1", parent_level=level_1)
  1. 给Level添加Question:
Question.objects.create(content="这是Level 1的第一个问题", level=level_1)
Question.objects.create(content="这是Level 1.1的第一个问题", level=sub_level_1)

4. 输出你要的示例结构

如果你想输出类似你给出的+ Level - Question嵌套格式,可以写个简单的递归函数来遍历:

def print_level_tree(level, indent=0):
    # 缩进控制层级显示
    indent_str = "  " * indent
    print(f"{indent_str}+ {level.name}")
    # 打印当前Level下的所有Question
    for question in level.questions.all():
        print(f"{indent_str}  - {question.content}")
    # 递归打印子Level
    for child_level in level.child_levels.all():
        print_level_tree(child_level, indent + 1)

# 调用示例:获取所有顶级Level并打印结构
top_levels = Level.objects.filter(parent_level__isnull=True)
for level in top_levels:
    print_level_tree(level)

运行这段代码就能得到你想要的嵌套输出啦。

5. 最后别忘了数据库迁移

写完模型后,执行以下命令让Django创建对应的数据库表:

python manage.py makemigrations
python manage.py migrate

这样就完全实现了你需要的嵌套模型结构,既支持Level包含多个Question,也支持Level自身的层级延伸~

内容的提问来源于stack exchange,提问作者Emmanuel Mtali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:11:09