Django 关系数据库模型

Django Relational Database Models

我有一个我希望是简单的问题。

我正在使用带有 Django 的 jsTree 制作一个具有树状布局的应用程序。目前树中的每个节点都有自己的对象,但我需要多棵树,所以我希望将一棵树的所有节点与另一个对象相关联,该对象将代表一棵包含所有节点的整棵树。

希望以上是有道理的。据我所知,我需要节点和整棵树之间的外键关系 object/model。理想情况下,有人可以向我指出如何正确编写外键关系,然后我将如何在客户端潜在地实例化一个 fulltree 对象?

感谢您的帮助和建议。

更新代码: 型号

from django.db import models

class StoringJSON(models.Model):
    parent = models.CharField(null=True, max_length=50)
    id = models.CharField(primary_key=True, max_length=50, unique=True)
    text = models.CharField(null=True, max_length=50)
    tree = models.Foreignkey(FullTree)

class FullTree(models.Model):
    pass

序列化器

from rest_framework import serializers
from treetool.models import StoringJSON
from django.contrib.auth.models import User

class TreeSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')

    class Meta:
        model = StoringJSON
        fields = ('id', 'text', 'parent')

查看

from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from django.db import models


@login_required
def tree(request):
    return render(request, 'treetool/tree.html')


from treetool.models import StoringJSON
from treetool.serializers import TreeSerializer

from rest_framework import generics


class TreeList(generics.ListCreateAPIView):
    queryset = StoringJSON.objects.all()
    serializer_class = TreeSerializer

class TreeDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = StoringJSON.objects.all()
    serializer_class = TreeSerializer

要获得树状关系,您可以很好地使用优秀的 django-mptt 模块。这个包的作用是这样的。

假设你有一个 "root node" 的节点,你可以在它下面有 n 个节点,所有这一切使你的树 A。现在假设您想要一个记录,您希望将所有这些树节点附加到哪里。所以你所要做的就是取这棵树的根 A 并且只将那个特定的('root')作为外键。所以现在,你有一个记录,它的根树 A 作为它的外键。

接下来,要检索该树中的所有节点,只需在您刚刚创建外键的根实例上调用 get_descendants() 方法。瞧,你有整棵树。

接下来,来到您的客户端部分,您必须在要遍历此树的模板顶部加载 mptt_tags。您将必须传递数组中的所有节点,其中索引为零的节点是树的根节点。您可以使用

构造此数组

nodes = root.get_descendants() nodes.insertAt(0, root)

现在,有一个漂亮的递归树模板标签,您可以使用它来遍历模板中的树节点。另外,请参阅文档以了解如何通过扩展 MPTTModel 使您的模型具有树状关系。

抱歉,如果我的例子不是很好,我不是很擅长举例子 :D 希望它能有所帮助。