2016-04-05 6 views
1

Ich arbeite an einer Django-App. Ich habe eine Tabelle, und eine ihrer Spalten kann einen von vier Werten haben, und abhängig von diesem Wert muss sie eine Eins-zu-Eins-Beziehung mit einer anderen Tabelle haben, die Spalten hat, die für diesen Wert spezifisch sind.Django-Modell, das eine eins-zu-eins-Beziehung zu einer von vier möglichen Tabellen haben muss

Hier ist meine models.py:

from django.db import models 

class Item(models.Model): 
    id = models.AutoField(primary_key=True) 
    type_choices = (
    ('A', 'Type A'), 
    ('B', 'Type B'), 
    ('C', 'Type C'), 
    ('D', 'Type D'), 
    ) 
    type = models.CharField(max_length=1, choices=type_choices) 


class TypeA(models.Model): 
    item = models.OneToOneField(
     Item, 
     primary_key=True, 
    ) 
    # Type A specific fields 


class TypeB(models.Model): 
    item = models.OneToOneField(
     Item, 
     primary_key=True, 
    ) 
    # Type B specific fields 


class TypeC(models.Model): 
    item = models.OneToOneField(
     Item, 
     primary_key=True, 
    ) 
    # Type C specific fields 


class TypeD(models.Model): 
    item = models.OneToOneField(
     Item, 
     primary_key=True, 
    ) 
    # Type D specific fields 

Da mir nichts von der Erstellung anhält, sagen wir, eine Zeile in TypeA und eine Zeile in TypeB, mit Verbindungen zurück zu der gleichen Zeile in Punkt (was ist nicht etwas, was ich will) Ich bin sicher, etwas zu vermasseln irgendwann.

Kann ich alles, was ich in Django oder etwas anderem tun kann, mich gegen dieses Problem schützen?

Oder sollten meine Modelle vielleicht ganz anders strukturiert sein?

Prost

+0

vielleicht check this out: http://stackoverflow.com/q/929029/2112269 – Aquiles

+0

Ich bin nicht sicher, wie das mir hilft. Schlägst du vor, dass ich ein ForeignKey-Feld in meinem Artikelmodell habe? – 99lives

+0

Das hilft mir nicht vermeiden zu vermeiden, mehrere ForeignKeys zu der einen Artikelzeile zu erstellen, die ich nicht möchte. – 99lives

Antwort

1

Haftungsausschluss: Dies ist keine vollständige Antwort sein kann, aber einige Hinweise liefern dorthin zu gelangen.


Dies könnte komplizierter als Sie denken.

Was können Sie tun, ist

  • eine Basisklasse erstellen - TypeBase für die Typen, die Sie haben. Fügen Sie den Fremdschlüssel Ihrer Artikelklasse hinzu
  • Erstellen Sie erforderliche Unterklassen pro Typ - class TypeA(TypeBase).
  • Verwenden Sie django's ContenType und fügen Sie seinen foreingn Schlüssel in der Basis hinzu. Dies wird verwendet, um zu bestimmen, welcher Instanztyp dieses bestimmte Objekt ist. ContentType erzeugt eine lose Kopplung zwischen den Klassen.
  • Überschreiben save() Methode von TypeBase, um den Typ entsprechend einzustellen.
  • Unter Umständen müssen Sie wie einige weitere Methoden hinzufügen
    • get_type - Typ von ContentType zu bekommen.
    • get_type_object - um ein Objekt eines bestimmten Typs vom Objekt TypeBase zu erhalten.
Verwandte Themen