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 希望它能有所帮助。
我有一个我希望是简单的问题。
我正在使用带有 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 希望它能有所帮助。