Frage

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

Gibt es Bibliotheken / Hacks ich in der Zwischenzeit verwenden kann, das grundlegende Verhalten zu erfassen? Ich habe eine Hierarchie, die verschiedene Objekte mischt. Das bekannteste Beispiel eines Unternehmen Struktur mit einer Employee-Klasse, Unterklassen für Arten von Mitarbeitern und einem manager_id (parent_id) wäre eine gute Annäherung des Problems ich bin zu lösen.

In meinem Fall würde Ich mag die Idee vertreten, dass ein Mitarbeiter andere Mitarbeiter verwalten kann, während sie von einem anderen Mitarbeiter verwaltet werden. Es gibt keine separate Klassen für Manager- und Arbeiter, die diese schwer über Tabellen zu verbreiten macht. Unterklassen darstellen würde Arten von Mitarbeitern-Programmierer, Buchhalter, Vertrieb, etc. und wäre unabhängig davon, wer überwacht die (OK, ich denke, es ist nicht mehr eine typische Corporation in irgendeiner Hinsicht).

War es hilfreich?

Lösung

Derzeit gibt es zwei Formen der Vererbung in Django -. MTI (Modell Tabelle Vererbung) und ABC (abstrakte Basisklassen)

Ich schrieb ein Tutorial auf das, was unter der Haube vor sich geht.

Sie können auch die offizielle Dokumentation auf Modell Vererbung .

Andere Tipps

ich glaube, das OP über bittet Single Table Inheritance als hier definiert:

  

Relationale Datenbanken unterstützen keine Vererbung, also, wenn von Objekten auf Datenbanken abzubilden wir müssen überlegen, wie unsere schönes Erbe Strukturen in relationalen Tabellen darzustellen. Wenn in einer relationalen Datenbank abzubilden, wir versuchen zu minimieren, die das kann schnell auffahren schließt sich, wenn in mehreren Tabellen eine Vererbungsstruktur zu verarbeiten. Single Table Inheritance bildet alle Felder aller Klassen einer Vererbungsstruktur in eine einzige Tabelle.

Dies bedeutet, dass eine einzelne Datenbanktabelle für eine ganze Hierarchie von Entitätsklassen. Django nicht, dass die Art der Vererbung unterstützen.

Sehen Sie meinen Versuch:

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

  

Eine Emulation von „Tabelle pro Hierarchie“ auch bekannt als „einzelner Tabelle Vererbung“ in Django. Die Basisklasse müssen alle Felder halten. Es Subklassen sind keine zusätzlichen Felder enthalten darf und optimal sollten sie Proxies sein.

Nicht gerade „einzelne Tabelle Vererbung“, aber nahe genug für viele Situationen.

Ich glaube, Sie so etwas wie dies 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'

Das kann einige Probleme mit Sperren hat ... Ich bin nicht wirklich sicher, wie django Griffe, die aus der Spitze von meinem Kopf. Auch habe ich nicht wirklich den obigen Code testen, es ist ausschließlich für Zwecke der Unterhaltung, um hoffentlich Sie auf dem richtigen Weg.

Dies könnte von Nutzen sein: https://github.com/craigds/django-typed- Modelle Es sieht so etwas wie eine Implementierung von Single Table Inheritance sein, aber es hat die Einschränkung, dass Unterklassen keine zusätzlichen Felder nicht 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 verschmolzen wurde möglicherweise zurück in

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top