2009-11-20 4 views
5

Si un modèle de django est fait abstraite, comme ci-dessous, est-il un moyen d'inspecter la classe pour déterminer qu'elle est abstraite?Django - comment déterminer si la classe de modèle est abstrait

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

j'attendre à ce que je pourrais examiner MyModel.Meta.abstract, mais selon Django docs:

Django fait faire un ajustement à la classe Meta d'une classe de base abstraite: avant d'installer le attribut Meta, il définit abstract = Faux. Cela signifie que les enfants des classes de base abstraites ne deviennent pas automatiquement eux-mêmes des classes abstraites.

Toutes les idées? Merci!

+0

Quel est le problème avec la lecture de la source? C'est toujours disponible. –

+0

Le résumé de docs est lié à la classe dérivée 'Meta, pas à la base. –

+1

@ S.Lott - En effet, je RTFM mais échoué à RTFS. Pour être juste, beaucoup de questions sur S.O. pourrait probablement être auto-répondu en lisant la source. @Dmitry - Je suis un peu confus par votre commentaire. Depuis django/db/basy.py, il semble que tous les attributs de la classe Meta sont transférés dans une nouvelle classe référencée _meta. C'est cette classe qui contient la valeur abstraite originale définie dans les méta-classes des modèles. Peu importe, @sheats répondu à ma question (Merci encore). – Nagyman

Répondre

12

Vous pouvez instancier MyModel puis vérifier ._meta.abstract.

donc dans le code:

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

Je n'ai pas repéré ça dans dir (MyModel), mais c'est là. Merci beaucoup. – Nagyman

+1

Si vous n'avez pas regardé iPython je le suggérerais fortement. Il est très utile pour jouer et découvrir ces choses, car il offre l'auto-complétion. C'est comme ça que j'ai trouvé celui-ci =) – sheats

+0

Est-il normal d'accéder à un membre protégé depuis l'extérieur en Python? – sergzach

1

Je voudrais souligner que vous n'avez pas besoin d'instancier un modèle pour vérifier si elle est abstraite - les modèles Django héritent d'une métaclasse réelle qui ajoute _meta la classe instanciation .

Ainsi, de manière similaire à @ code de sheats, essayez

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

Ou, pour un exemple positif

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

Bien sûr, cela fonctionne aussi pour les modèles intégrés et tout héritant du modèle de Django .

from django.contrib.auth.models import User 
print User._meta.abstract 
Questions connexes