2008-10-27 15 views
19

Gibt es explizite Unterstützung für Single Table Inheritance in Django? Zuletzt hörte ich, das Feature war noch in der Entwicklung und Debatte.Single Table Vererbung in Django

Gibt es Bibliotheken/Hacks, mit denen ich in der Zwischenzeit das Grundverhalten erfassen kann? Ich habe eine Hierarchie, die verschiedene Objekte mischt. Das kanonische Beispiel einer Unternehmensstruktur mit einer Employee-Klasse, Unterklassen für Mitarbeiterarten und einer manager_id (parent_id) wäre eine gute Annäherung an das von mir gelöste Problem.

In meinem Fall möchte ich die Idee vertreten, dass ein Mitarbeiter andere Mitarbeiter verwalten kann, während er von einem anderen Mitarbeiter verwaltet wird. Es gibt keine separaten Klassen für Manager und Worker, was es schwierig macht, sie auf Tabellen zu verteilen. Unterklassen würden Typen von Angestellten darstellen - Programmierer, Buchhalter, Verkäufe usw. und wären unabhängig davon, wer beaufsichtigt (OK, ich denke, es ist in gewisser Hinsicht kein typisches Unternehmen mehr).

+0

Sie das dritte Paket verwenden können, die Ihnen Single Table Inheritance gibt: https://github.com/craigds/django-typed-models – guettli

Antwort

15

Es gibt derzeit zwei Formen der Vererbung in Django - MTI (Modell Tabellenvererbung) und ABC (abstrakte Basisklassen).

Ich schrieb eine tutorial auf, was unter der Haube vor sich geht.

Sie können auch auf die offiziellen Dokumente unter model inheritance verweisen.

15

Ich denke, die OP über Einzeltisch Vererbung als defined here fragt:

Relationale Datenbanken nicht Vererbung unterstützen, so dass, wenn von Objekten auf Datenbanken abzubilden wir berücksichtigen müssen, wie unser schönes Erbe Strukturen darzustellen in relationalen Tabellen. Bei der Zuordnung zu einer relationalen Datenbank versuchen wir, die Joins zu minimieren, die bei der Verarbeitung einer Vererbungsstruktur in mehreren Tabellen schnell verfügbar werden. Single Table Inheritance bildet alle Felder aller Klassen einer Vererbungsstruktur in eine einzige Tabelle ab.

Das ist eine einzelne Datenbanktabelle für eine ganze Hierarchie von Entitätsklassen. Django unterstützt diese Art der Vererbung nicht.

+0

nur einen Tisch verwenden, was ist nicht möglich in Django? – eugene

+0

Verwenden einer Tabelle für mehrere Modelle - das wird nicht unterstützt –

+0

@eugene Single-Table-Vererbung ist eine von mehreren Möglichkeiten, Vererbung in einer relationalen Datenbank zu erhalten. Und ich denke, es ist besser als die zwei Wege, die in diesem Moment im Django unterstützt werden. – guettli

1

Ich denke, dass Sie etwas Ähnliches tun können.

Ich habe eine Lösung für dieses Problem selbst zu implementieren, und hier war, wie ich es gelöst:

class Citrus(models.Model) 
    how_acidic = models.PositiveIntegerField(max_value=100) 
    skin_color = models.CharField() 
    type = models.CharField() 

class TangeloManager(models.Manager) 
    def get_query_set(self): 
     return super(TangeloManager, self).get_query_set().filter(type='Tangelo') 

class Tangelo(models.Model) 
    how_acidic = models.PositiveIntegerField(max_value=100) 
    skin_color = models.CharField() 
    type = models.CharField() 
    objects = TangeloManager() 
    class Meta: 
     # 'appname' below is going to vary with the name of your app 
     db_table = u'appname_citrus' 

Diese einige Probleme mit Sperren haben kann ... Ich bin mir nicht wirklich sicher, wie django dass Griffe aus die Spitze meines Kopfes. Außerdem habe ich den obigen Code nicht wirklich getestet, es ist ausschließlich zu Unterhaltungszwecken gedacht, um dich hoffentlich auf den richtigen Weg zu bringen.

+0

interessante Idee ... aber ich denke, Syncdb würde einen Fehler wie "Tabelle appname_citrus bereits existiert", wie es würde versuchen, die Tabelle appname_citrus zu erstellen, nachdem es bereits von der Citrus-Klasse erstellt wurde. Ich habe es nicht versucht. Wenn dies funktioniert, würde ich mir vorstellen, dass Sie eine abstrakte Basisklasse verwenden können, um die Feldnamen nicht erneut eingeben zu müssen. –

3

Siehe meinen Versuch:

http://djangosnippets.org/snippets/2408/

Eine Emulation von "Tabelle pro Hierarchie" auch bekannt als "einzelner Tabelle Vererbung" in Django. Die Basisklasse muss alle Felder enthalten. Die Unterklassen dürfen keine zusätzlichen Felder enthalten und sollten idealerweise Proxies sein.

Nicht genau "Single Table Vererbung", aber nahe genug für viele Situationen.

2

dies könnte nützlich sein: https://github.com/craigds/django-typed-models Es sieht aus wie eine Implementierung der Single Table Inheritance, aber es hat die Einschränkung, dass Unterklassen keine zusätzlichen Felder haben können.

gibt es auch eine Gabel, die das Problem der nicht in der Lage zu schaffen zusätzliche Felder Adressen: https://github.com/KrzysiekJ/django-typed-models

Update: Ich glaube, die Gabel zusammengeführt wurde wieder kann hier in

ist eine neue Diskussion über die django Entwickler-Mailingliste über STI: https://groups.google.com/forum/#!msg/django-developers/-UOM8HNUnxg/6k34kopzerEJ

Verwandte Themen