2012-03-28 10 views
3

Ich habe Probleme zu verstehen, warum bestimmte Eigenschaften in einigen Modellen existieren, so hoffe ich, dass jemand sie hier erklären kann.Django Modell Vererbung Quirks

Hier ist ein einfaches Beispiel:

class Alpha(models.Model): 
    one = models.PositiveIntegerField() 


class Bravo(Alpha): 
    two = models.PositiveIntegerField() 


class Charlie(Alpha): 
    three = models.PositiveIntegerField() 


"bravo" in dir(Charlie()) 
True 

Wie es ist, dass eine Instanz von Charlie eine bravo Eigenschaft hat? Gibt es einen Grund dafür? Habe ich etwas verpasst?

Noch wichtiger, warum verhindert dies, dass ich eine bravo Eigenschaft der Klasse Charlie hinzufügen?

... 
class Charlie(Alpha): 
    three = models.PositiveIntegerField() 
    bravo = models.TextField() 


Charlie() 
ValueError: Cannot assign "''": "Charlie.bravo" must be a "Bravo" instance. 
+0

Ich muss * wirklich * meinen Blogbeitrag beenden, warum man nie Modellvererbung verwenden sollte. –

+1

Wenn du es tust, poste es hier, oder? Ich würde es gerne lesen. –

Antwort

2

Die Vererbungsbeziehung stellt Verbindungen zwischen dem Kind Modell und jeder seiner Eltern (über eine automatisch erstellte OneToOneField).

In Ihrem Fall bedeutet das, dass Alpha bei der Definition von Bravo die Eigenschaft "bravo" erhält.

Siehe Multi-table inheritance und Inheritance and reverse relations Dokumentation.

3

Soweit ich das beurteilen kann, ist dies eine Folge der Tatsache, dass die übergeordnete Klasse einen impliziten Fremdschlüssel für alle seine Nachkomme hat, die von den Kindern vererbt wiederum. Das sollte wahrscheinlich nicht passieren, aber es gibt keine Möglichkeit, dies zu verhindern.

Eine Möglichkeit könnte explicitly set the parent link auf Bravo sein, so dass sein related_name etwas anderes als "Bravo" ist, so dass Sie diesen Namen in Charlie wiederverwenden können.

class Bravo(Alpha): 
    two = models.PositiveIntegerField() 
    alpha = models.OneToOneField(Alpha, parent_link=True, related_name='not_bravo')