2016-05-02 7 views
0

Ich habe, was ich hoffe, ist eine einfache Frage.Django relationale Datenbank Modelle

Ich mache eine Anwendung, die ein Baum wie Layout mit jsTree mit Django hat. Momentan hat jeder der Knoten im Baum ein eigenes Objekt, aber ich brauche mehrere Bäume, also suche ich alle Knoten für einen Baum mit einem anderen Objekt zu verbinden, das einen ganzen Baum mit allen Knoten darstellt.

Hoffentlich macht das oben Sinn. Von dem, was ich sagen kann, brauche ich eine Fremdschlüsselbeziehung zwischen den Knoten und dem gesamten Baumobjekt/Modell. Im Idealfall könnte mir jemand aufzeigen, wie man die Fremdschlüsselbeziehung richtig schreibt, und dann, wie ich ein Fulltree-Objekt auf der Clientseite potentiell instanziieren würde?

Vielen Dank für jede Hilfe und Anregungen.

Aktualisiert Code: Modell

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 

Serializer

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

Ansicht

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 
+0

Haben Sie versucht, "django Fremdschlüssel" zu googeln? –

+0

Ja - ich verstehe, dass ich ein Fremdschlüsselattribut erstellen muss, das auf ein anderes Modell verweist, aber ich weiß nicht, wie ich danach arbeiten soll – Kevin

+0

Veröffentlichen Sie den Code, den Sie bisher haben. –

Antwort

0

Für einen Baum Art von Beziehungen haben, können Sie sehr gut ausgezeichnet verwenden django-mptt Modul. Was dieses Paket macht, ist so etwas.

Sagen wir Ihnen einen Knoten, der "Root-Knoten" ist, können Sie n Anzahl der Knoten darunter haben und all dies macht Ihren Baum A. Nehmen wir nun an, Sie möchten einen Datensatz erstellen, an den alle Knoten des Baums angehängt werden sollen. Alles, was Sie tun müssen, ist die Wurzel dieses Baumes A zu nehmen und nur dieses spezielle ('root') als Fremdschlüssel zu machen. So, jetzt haben Sie einen Datensatz, der Wurzel des Baumes A als seinen Fremdschlüssel hat.

Um alle Knoten in diesem Baum abzurufen, rufen Sie einfach get_descendants() Methode für diese Stamminstanz, die Sie gerade aus dem Fremdschlüssel gemacht haben. Voila, du hast deinen ganzen Baum.

Als nächstes, zu Ihrem Client-Seite Teil kommen, müssen Sie mptt_tags direkt an der Spitze der Vorlage laden, in dem Sie diesen Baum durchlaufen möchten. Sie müssen alle Knoten in einem Array übergeben, wobei der Knoten mit dem Index Null der Stammknoten des Baums ist. Sie können dieses Array konstruieren von

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

Jetzt verwenden, gibt es eine schöne recursetree TemplateTag, die Sie verwenden können, um die Baumknoten in Vorlage zu durchqueren. Sehen Sie auch in der Dokumentation nach, wie Sie Ihrem Modell eine baumähnliche Beziehung geben, indem Sie MPTTModel erweitern.

Entschuldigung, wenn mein Beispiel nicht wirklich großartig ist, bin ich nicht wirklich gut darin, Beispiele zu geben: D und hoffe, es hilft.