2016-07-10 12 views
0

In Django zu holen, ich bin mit konkretem Erbe wie folge:django konkretes Erbe, __str __ (self) in Eltern versagt Attribut von Kind

die Client-Klasse ist ein konkret Eltern, die allgemeinen Felder habe. Ein Kunde kann eine Einzelperson oder eine Partnerschaft oder ein Unternehmen sein ...

Hinweis: Ja, ich habe die Nachteile der konkreten Vererbung gelesen, aber meine Datenbank wird klein sein, und ich möchte es sein in der Lage, Eindeutigkeitsbedingungen aus der Client-Tabelle einfach zu erzwingen.

Ein Objekte Namensattribut in der Tabelle nur Kind wohnt (Weil ein indiviual hat Vorname, Zweiter Vorname, Nachname, während ein Unternehmen nicht)

Ich möchte die str (Selbst-) -Methode von der verwenden Elternklasse, um den Namen der Einzelperson, der Partnerschaft oder des Unternehmens zurückzugeben, je nachdem.

Im Einzel Modell, ich habe die Namen (Selbst-) Methode:

def name(self): 
     if self.Middle_Name is None: 
      return self.First_Name + " " + self.Last_Name 
     else: 
      return self.First_Name + " " + self.Middle_Name + " " + self.Last_Name 

Im Client() Modell habe ich die str (Selbst-) Methode:

def __str__(self): 
    return self.name() 

Verständlicherweise bekomme ich die 'Client' Objekt hat kein Attribut 'Name' Fehler, wenn ich eine Liste aller Client-Namen bekommen muss.

Gibt es eine Möglichkeit, dies zu erreichen? Es tut mir leid, ich bin sehr neu in objektorientierten Programmierkonzepten und zu Django.

Antwort

0

Dies ist der falsche Weg. Wenn Ihre Methode auf ein Attribut verweist, das nur für das untergeordnete Modell vorhanden ist, sollte es sich um dieses untergeordnete Modell handeln. Als Bonus, der die Logik viel einfacher macht:

class Client: 
    def name(self): 
     return self.First_Name + " " + self.Last_Name 

class Individual(Client): 
    def name(self): 
     return self.First_Name + " " + self.Middle_Name + " " + self.Last_Name 
+0

Danke, aber ich wollte die __str verwenden __ (Selbst-) Methode in der übergeordneten Klasse, für django Administrator in der Lage sein, alle Kunden zu verzeichnen, unabhängig von den Unterschieden in ihren Namensregeln. __str __ (Selbst-) Methode. Ich hoffe ich mache Sinn. Danke –

+0

Das hat mit diesem Code überhaupt nichts zu tun. Wenn Sie sich im Django-Admin die Listenseite für Einzelpersonen ansehen, sind * alle * Instanzen Einzelpersonen, selbst wenn sie auch Clients sind. Also * keine * von ihnen wird Middle_Name Attribute haben. –

+0

Nur noch eine Frage, was meinst du mit "class Client (Individual):", denn es ist Individuum, das vom Client erbt, nicht umgekehrt. –