如何创建模型的层次结构?

时间:2018-06-15 15:23:39

标签: python django python-3.x django-1.11

如何在django中制作层次结构?我想创建一个人树。我知道我应该在Person模型中添加父字段。我需要在模型和视图中更改什么?另外,我想使用树视图来表示层次结构。

enter image description here

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')

1 个答案:

答案 0 :(得分:0)

如果您向父人添加外键,则可以轻松创建一个heirachy

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')

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

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>

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