Django-Modell, Vererbung Und Foreign Keys
Grundsätzlich habe ich ein Modell wo ich habe eine Superklasse, vielen anderen Klassen teilen, und dann jede dieser Klassen hat einige einzigartige Eigenschaften, die sich voneinander unterscheiden. Sagen wir Klasse A ist die Superklasse und Klasse B, C und D sind Kinder der Klasse.
Sowohl der Klasse B und der Klasse C kann ein Vielfaches der Klasse D, jedoch habe ich gesehen, dass es am besten, um die Fremdschlüssel-Beziehung in der Klasse D, die bezieht sich dann auf der übergeordneten Klasse. Nun in den anderen Sprachen, ich könnte einfach sagen, es ist ein ForeignKey Beziehung zu der Klasse A, und dann die Sprache erkennt, die die Klassen " true type. Aber ich glaube nicht, dass Sie, wie es funktioniert mit Python.
Was ist die beste empfohlene Weg der Verfolgung dieses Problem?
EDIT: das Hier ist in etwa was ich meine...
class A(models.Model):
field = models.TextField()
class B(A):
other = <class specific functionality>
class C(A):
other2 = <different functionality>
class D(A):
#I would like class D to have a foreign key to either B or C, but not both.
Im wesentlichen, Klasse B und Klasse C haben beide mehrere class-D ist. Aber eine bestimmte Klasse D gehört nur zu einer von Ihnen.
- könnten Sie erklären, warum Sie benötigen Vererbung?
- Es gibt eine Verwandte Frage hat einige nette Antworten, die vielleicht helfen: stackoverflow.com/questions/1114767/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der Django-Docs:
Normalerweise würden Sie müssen nur
Restaurant
Erben vonPlace
. Leider müssen Sie, was ich für einen hack: einen eins-zu-eins-Referenz von der Unterklasse zur Oberklasse (Restaurant
zuPlace
)Sie könnte auch tun, eine generische relation http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#id1 und überprüfen Sie die Arten zu beschränken, es zu B oder C, wenn die Einstellung oder speichern. Dies ist wahrscheinlich mehr Arbeit, als herauszufinden, die direkten Bezug, aber vielleicht fühlen sich sauberer.
Einen Weg, dies zu tun ist das hinzufügen eine Zwischenklasse wie folgt:
Verwendung einer intermediate-Klasse (Target) garantiert, dass nur ein link von D entweder B oder C. Macht das Sinn? Sehen http://docs.djangoproject.com/en/1.2/topics/db/models/#model-inheritance für weitere Informationen.
In der Datenbank gibt es Tabellen für die Zielgruppe, B, C und D, aber nicht A, denn das war, als Abstrakt markiert (statt Spalten verbundene Attribute, die auf Einen in der Gegenwart in Ziel und D).
[Warnung: ich habe nicht wirklich versucht dieses code - Korrekturen willkommen!]
Sehe ich hier ein problem:
Kann es nicht tun. Sie müssen hinzufügen, weil in der SQL-Spalten müssen genau definiert werden.
Auch, obwohl vererbt Modelle, wie haben Sie das kompilieren mit
syncdb
- Sie scheinen nicht zu Verhalten, wie man es erwarten würde - zumindest konnte ich nicht machen Sie arbeiten. Ich kann nicht erklären, warum.Dies ist, wie FK arbeitet in Django
diese Weise können Sie effektiv, haben ein Vielfaches von D in B.
Vererbung der Modelle (z.B. Klasse B(A)) nicht funktioniert wie ich es erwarten würden. Vielleicht kann jemand anders es besser erklären.
Werfen Sie einen Blick auf dieser doc Seite. Es geht um viele-zu-eins-Beziehung in django.