簡體   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