2009-11-20 12 views
5

Wenn ein Django-Modell abstrakt gemacht wird, wie unten, gibt es eine Möglichkeit, die Klasse zu überprüfen, um festzustellen, dass es abstrakt ist?Django - wie zu bestimmen, ob Modellklasse ist abstrakt

class MyModel(models.Model): 
    class Meta: 
    abstract = True 

Ich würde erwarten, dass ich MyModel.Meta.abstract untersuchen konnte, aber nach Django docs:

Django macht eine Anpassung an die Meta-Klasse von einer abstrakten Basisklasse machen: vor der Installation Meta-Attribut, es setzt abstrakt = Falsch. Dies bedeutet, dass Kinder von abstrakten Basisklassen nicht automatisch selbst zu abstrakten Klassen werden.

Irgendwelche Ideen? Vielen Dank!

+0

Was ist los mit dem Lesen der Quelle? Es ist immer verfügbar. –

+0

Die Zusammenfassung von Docs bezieht sich auf abgeleitete Klasse 'Meta, nicht Basis. –

+1

@ S.Lott - In der Tat habe ich RTFM aber RTFS gescheitert. Um fair zu sein, viele der Fragen zu S.O. könnte wahrscheinlich durch das Lesen der Quelle selbst beantwortet werden. @Dmitry - Ich bin ein wenig verwirrt durch Ihren Kommentar. Von django/db/basy.py scheint es, dass alle Attribute in der Meta-Klasse in eine neue Klasse übertragen werden, die als _meta referenziert wird. Es ist diese Klasse, die den ursprünglichen abstrakten Wert in den Meta-Klassen der Modelle enthält. Unabhängig davon beantwortete @sheats meine Frage (Danke nochmal). – Nagyman

Antwort

12

Sie können MyModel instanziieren und dann ._meta.abstract überprüfen.

So in Code:

m = MyModel() 
print m._meta.abstract 
+0

Ich habe das in dir (MyModel) nicht gefunden, aber es ist da. Vielen Dank. – Nagyman

+1

Wenn Sie nicht in iPython geschaut haben, würde ich es dringend empfehlen. Es ist sehr nützlich, um herumzuspielen und diese Dinge herauszufinden, da es automatische Vervollständigung bietet. So habe ich das gefunden =) – sheats

+0

Ist es normal, in Python von außen auf ein geschütztes Mitglied zuzugreifen? – sergzach

1

Ich möchte darauf hinweisen, dass Sie nicht brauchen, um ein Modell zu instanziiert zu überprüfen, ob es abstrakt ist - Django Modelle erben eine tatsächliche Metaklasse, die _meta auf Klasse Instanziierung fügt .

So ähnlich wie @ sheats Code, versuchen

from django.db.models import Model 
class MyModel(Model): 
    pass 
print MyModel._meta.abstract 

Oder für ein positives Beispiel

from django.db.models import Model 
class MyModel(Model): 
    class Meta(object): 
    abstract = True 
print MyModel._meta.abstract 

Natürlich funktioniert das auch für Einbaugeräte und alles von Djangos Modell vererben .

from django.contrib.auth.models import User 
print User._meta.abstract 
Verwandte Themen