2016-12-04 9 views
0

Ich versuche, das folgende Datenmodell in einer Django-Applikation zu implementieren:Django One-To-One und One-To-Many Beziehungen

Ein Projekt besteht aus drei Behältern: 1) umsetzbare 2) Referenzen 3) Backburner

Ein Eintrag kann innerhalb eines Projekts erstellt werden und muss einem der Container zugewiesen werden (er kann nicht frei schwebend bleiben).

Daher enthält ein Projekt immer die drei Container, von denen jeder leer sein kann. Ein Eintrag befindet sich immer in einem (und nur einem) der Container. Ein Eintrag kann jedoch von Container zu Container umgeschaltet werden.

Hier ist mein Versuch. Ist das überhaupt sinnvoll?

class Project(models.Model): 
    project_title = models.CharField() 
    created_date = models.DateTimeField('date created') 

class References(models.Model): 
    project = models.OneToOneField(
     Project, 
     on_delete=models.CASCADE, 
     primary_key=True, 
    ) 

class BackburnerItems(models.Model): 
    project = models.OneToOneField(
     Project, 
     on_delete=models.CASCADE, 
     primary_key=True, 
    ) 

class ActionSteps(models.Model): 
    project = models.OneToOneField(
     Project, 
     on_delete=models.CASCADE, 
     primary_key=True, 
    ) 

class Entry(models.Model): 
    title = models.CharField(max_length=200) 
    description = models.CharField(max_length=200) 
    action_steps = models.ForeignKey(ActionSteps) 
    references = models.ForeignKey(References) 
    backburner = models.ForeignKey(BackburnerItems) 

Antwort

1

Sie können eine einfaches CharField mit Wahlen verwenden, um einen Eintrag zu einem bestimmten Container zuzuordnen:

class Entry(models.Model): 
    REFERENCE = 'reference' 
    BACKBURNER = 'backburner-item' 
    ACTION_STEP = 'action-step' 
    CONTAINER_CHOICES = (
     (REFERENCE, 'Reference'), 
     (BACKBURNER, 'Backburner item'), 
     (ACTION_STEP, 'Action step'), 
    ) 
    container = models.CharField(choices=CONTAINER_CHOICES) 
    project = models.ForeignKey('Project', on_delete=models.CASCADE) 
    ... 

Sie leicht für Einträge, die zu einem bestimmten Container abfragen können, entweder von einer Project Instanz oder von die Entry Klasse:

references = project.entry_set.filter(container=Entry.REFERENCE) 
+0

ich sehe. Gibt es eine Möglichkeit, sicherzustellen, dass Container beim Erstellen eines Projekts erstellt werden? Oder soll ich nur einen Container für ein Projekt anlegen, wenn ein Eintrag dorthin verschoben werden soll? – MadPhysicist

+1

Der Container ist nicht mehr ein separates Modell, es ist einfach ein Char-Feld im 'Entry'-Modell, wobei der 'Entry' direkt einen' ForeignKey' zum 'Project' hat. Sie müssen die Container nicht separat erstellen. – knbk

+0

Verstanden. Vielen Dank! – MadPhysicist

Verwandte Themen