如何创建模型层次结构?

How to create hierarchy of models?

如何在 Django 中创建层次结构?我想创建一棵人物树。我知道我应该将 parent 字段添加到 Person 模型。我需要在模型和视图中更改什么?另外我想用树视图来表示层次结构。

class Person(models.Model):
    name = models.CharField(max_length=40)

    def __str__(self):
        return self.name

def add_person(request):
    if(request.method == 'POST'):
        name = request.POST['name']
        person = Person(name=name)
        person.save()

        return redirect('/persons')
    else:
        return render(request, 'add_person.html')

如果给parent人加上外键,就可以轻松创建继承人

class Person(models.Model):
    name = models.CharField(max_length=40)
    parent = models.ForeignKey('self', null=True, blank=True, related_name='children')

    def __str__(self):
        return self.name

def add_person(request):
    if(request.method == 'POST'):
        name = request.POST['name']
        parent_id = request.POST.get('parent_id')
        person = Person(name=name, parent_id=parent_id)
        person.save()

        return redirect('/persons')
    else:
        return render(request, 'add_person.html')

要获得一个人的所有 children 你可以简单地做

person = Person.objects.get(id=p_id)
person.children.all()

我不确定是否有内置的 TreeView,但您可以随时构建它

# view
def tree_view(request):
    people = Person.objects.prefetch('children')
    return render(request, 'template.html', {'people': people})

# template
<ul>
{% for person in people %}
    <li>
        {{ person.name }}
        <ul>
        {% for child in person.children.all %}
            <li>{{ child.name }}</li>
        {% endfor %}
        </ul>
    </li>
{% endif %}
</ul>

当然你可以创建多个模板并使用 include 使它们递归,这样你就可以有 n 代