繁体   English   中英

Django关系数据库模型

[英]Django Relational Database Models

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

我正在使用jsTree和django制作具有布局之类的树的应用程序。 当前树中的每个节点都有自己的对象,但是我需要多棵树,因此我希望将一棵树的所有节点与另一个对象相关联,这将代表其中包含所有节点的整个树。

希望上面有道理。 据我所知,我需要在节点与整个树对象/模型之间建立外键关系。 理想情况下,有人可以向我指出如何正确编写外键关系,然后如何潜在地在客户端实例化全树对象?

感谢您的帮助和建议。

更新的代码:型号

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模块。 这个软件包的作用是这样的。

假设您是一个“根节点”节点,它下面可以有n个节点,所有这些使您的树成为A。 现在,假设您希望有一条记录,要将树的所有这些节点都附加到该记录上。 因此,您所需要做的就是取这棵树A的根,并仅将特定的('root')作为外键。 因此,现在,您有了一个以树A的根作为外键的记录。

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

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

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

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

不好意思,如果我的例子不是很好,我不是很擅长举例:D,希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM