2016-05-19 2 views
1

Ich habe viele Klassen mit dem gleichen Feld namens state, die CharField mit Auswahl ist. Und alle diese Klassen erben von einer abstrakten Klasse. Ich beschloss, Entscheidungen Variable zu dieser abstrakten Klasse zu setzen:Django. Warum kann ich Parameter nicht von der abstrakten Modellklasse zum Kindmodellfeld übergeben?

class UsefullAbstractClass(models.Model): 
    NEW = 'new' 
    ACTUAL = 'actual' 
    DELETE = 'delete' 

    STATE_CHOICES = (
     (NEW, 'new'), 
     (ACTUAL, 'actual'), 
     (DELETE, 'delete')) 

    class Meta: 
     abstract = True 

Hier mein Kind Klasse:

ChildClass(UsefullAbstractClass): 
    state = models.CharField(
      max_length=100, 
      choices=STATE_CHOICES) 

Und ich habe

Name 'STATE_CHOICES' definiert ist, nicht

Dann verwende ich manage.py shell für überprüfen, ob diese Variable existiert. Und alle Kindklasse hat diese Variable

>>> c = ChildClass.objects.all() 
>>> c[0].STATE_CHOICES 
(('new', 'new'), ('actual', 'actual'), ('delete', 'delete')) 

Wie kann ich dieses Problem lösen?

+0

Sie das Statusfeld in 'UsefullAbstractClass' statt' ChildClass' definieren – Pavan

+0

@Pavan ja ich kann, aber in einigen anderen Modellen Ich habe verschiedene choises für Staat und möchte diese Variable einfach übersteuern. Und ich möchte verstehen, warum diese Vererbung nicht im Feld funktioniert, aber ich kann diese Variable in allen Instanzen dieser Klasse sehen –

Antwort

4
ChildClass(UsefullAbstractClass): 
    state = models.CharField(
      max_length=100, 
      choices=UsefullAbstractClass.STATE_CHOICES) 

In der Klassendefinition definierte Variablen sind Klassenvariablen; Sie werden von allen Instanzen geteilt. Um Instanzenvariablen zu erstellen, können sie in einer Methode mit self.name = value festgelegt werden. Beide Klassen- und Instanzvariablen sind über die Notation self.name zugänglich.

Sie können auf alle Methoden von ChildClass wie self.STATE_CHOICES zugreifen. Deshalb funktioniert es für c[0].STATE_CHOICES

So ist es nur mit den Instanzen (self.variable_name) zugänglich. Wenn Sie außerhalb der Methoden darauf zugreifen möchten, sollten Sie class.variable_name tun.

Für weitere Informationen klicken Sie bitte auf den Link http://docs.python.org/reference/compound_stmts.html#class-definitions

+0

Vielen Dank. Es funktioniert, aber ich möchte wirklich verstehen, warum ich 'STATE_CHOICES' nicht verwenden kann. Wenn Sie es erklären können, wird es nett sein –

+1

Weil es in UsefulAbstractClass definiert ist. –

+0

@Annoop, vielen Dank für das Detail Antwort! –

Verwandte Themen