2009-11-20 15 views
5

Se un modello Django è fatto astratto, come qui di seguito, c'è un modo per controllare la classe di determinare che è astratto?Django - come determinare se la classe del modello è astratta

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

Mi aspetterei che ho potuto esaminare MyModel.Meta.abstract, ma secondo Django documentazione:

Django fa fare un aggiustamento alla classe di Meta di una classe astratta di base: prima di installare il Attributo Meta, imposta abstract = False. Ciò significa che i bambini di classi base astratte non diventano automaticamente classi astratte.

Qualche idea? Grazie!

+0

Cosa c'è di sbagliato leggendo la fonte? È sempre disponibile –

+0

L'estratto da docs è correlato alla classe derivata 'Meta, non base'. –

+1

@ S.Lott: infatti, RTFM non è riuscito a RTFS. Per essere onesti, molte delle domande su S.O. potrebbe probabilmente essere auto-risposta leggendo la fonte. @Dmitry - Sono un po 'confuso dal tuo commento. Da django/db/basy.py, sembra che tutti gli attributi nella classe Meta vengano trasferiti in una nuova classe referenziata come _meta. È questa classe che mantiene il valore astratto originale impostato nelle classi Meta dei modelli. In ogni caso, @sheats ha risposto alla mia domanda (Grazie ancora). – Nagyman

risposta

12

È possibile creare un'istanza MyModel e quindi controllare ._meta.abstract.

Così in codice:

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

Non l'ho notato in dir (MyModel), ma è lì. Grazie mille. – Nagyman

+1

Se non hai guardato in iPython, lo consiglio vivamente. È molto utile per giocare e scoprire queste cose poiché offre il completamento automatico. Ecco come ho trovato questo =) – sheats

+0

È normale accedere a un membro protetto dall'esterno in Python? – sergzach

1

vorrei far notare che non è necessario creare un'istanza di un modello per verificare se si tratta di abstract - modelli Django ereditano un metaclasse reale che aggiunge _meta sulla classe di un'istanza .

Così, in modo simile a @ di guaine di codice, provare

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

Oppure, per un esempio positivo

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

Naturalmente, questo funziona anche per i modelli e tutto built-in che ereditano dal modello di Django .

from django.contrib.auth.models import User 
print User._meta.abstract 
Problemi correlati