2009-11-20 13 views
5

Si un modelo django se hace abstracto, como a continuación, ¿hay alguna forma de inspeccionar la clase para determinar si es abstracta?Django: cómo determinar si la clase de modelo es abstracta

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

yo esperaría que pudiera examinar MyModel.Meta.abstract, pero de acuerdo con documentos de Django:

Django hace que un ajuste a la clase Meta de una clase base abstracta: antes de instalar el Meta atributo, establece abstract = False. Esto significa que los niños de clases base abstractas no se convierten automáticamente en clases abstractas.

¿Alguna idea? ¡Gracias!

+0

¿Qué pasa con la lectura de la fuente? Siempre está disponible. –

+0

El resumen de documentos está relacionado con la clase derivada 'Meta, no base'. –

+1

@ S.Lott - De hecho, RTFM pero no pude RTFS. Para ser justos, muchas de las preguntas sobre S.O. probablemente podría ser auto-respondida leyendo la fuente. @Dmitry - Estoy un poco confundido por tu comentario. Desde django/db/basy.py, parece que todos los atributos en la clase Meta se transfieren a una nueva clase a la que se hace referencia como _meta. Es esta clase la que contiene el valor abstracto original establecido en las Metaclases de los modelos. De todos modos, @sheats respondió mi pregunta (Gracias de nuevo). – Nagyman

Respuesta

12

Puede instanciar MyModel y luego marcar ._meta.abstract.

Así que en código:

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

No detecté eso en dir (MiModelo), pero está ahí. Muchas gracias. – Nagyman

+1

Si no ha investigado en iPython, lo recomiendo encarecidamente. Es muy útil para jugar y descubrir estas cosas, ya que ofrece autocompletado. Así es como encontré este =) – sheats

+0

¿Es normal acceder a un miembro protegido desde afuera en Python? – sergzach

1

me gustaría señalar que no es necesario crear una instancia de un modelo para comprobar si es abstracto - modelos de Django heredan una metaclase real que añade _meta en la creación de instancias de clases .

Por lo tanto, de manera similar al código de @ Sheats, tratar

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

O, para un ejemplo positivo

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

Por supuesto, esto también funciona para los modelos y nada incorporadas que heredan de modelo de Django .

from django.contrib.auth.models import User 
print User._meta.abstract 
Cuestiones relacionadas