2010-02-22 10 views
9

Tengo una clase llamada BankAccount como clase base. También tengo clases CheckingAccount y SavingsAccount que heredan de BankAccount.¿Cómo puedo determinar si la instancia de clase del modelo de Django es una subclase de otro modelo?

BankAccount no es una clase abstracta, pero no creo un objeto a partir de ella, solo las clases heredadas.

Entonces, ejecutar una consulta como esta:

account = BankAccount.objects.get(id=10) 

¿Cómo sé si la cuenta es CheckingAccount o SavingsAccount?

La forma en que hago esto ahora es de esta manera:

checking_account = CheckingAccount.objects.get(id=account.id) 

Si existe, se trata de un CheckingAccount, de lo contrario, se trata de un SavingsAccount.

+0

Tengo un problema similar. Verifica mi enfoque! http://stackoverflow.com/questions/12411232/django-multi-table-inheritance-how-to-know-which-is-the-child-class-of-a-model – luistm

Respuesta

10

Intente utilizar los atributos checkingaccount y savingsaccount. El que es no explotará.

+0

Enlace: http: //docs.djangoproject.com/en/1.1/topics/db/models/#id7 –

+1

¿Qué sucede si el nombre del atributo solo se conoce en el tiempo de ejecución? –

+0

En tiempo de ejecución, suponga que ha seleccionado un objeto base 'BankAccount' llamado' account' y el nombre del atributo variable es 'attr_name'. Ejecute 'hasattr (account, attr_name)' y obtendrá True si hay una subclase de ese tipo, o False si no es así. – Furbeenator

-2

Un poco janky, pero esto funcionaría:

>>> class BankAccount(object): pass 
... 
>>> class SavingsAccount(BankAccount): pass 
... 
>>> class CheckingAccount(BankAccount): pass 
... 
>>> x = SavingsAccount() 
>>> type(x) == type(SavingsAccount()) 
True 
>>> type(x) == type(CheckingAccount()) 
False 
+2

'type (x) == SavingsAccount' hace lo mismo sin crear un nuevo objeto. –

+3

Esto fallará horriblemente si consultas desde 'Cuenta bancaria'. Django no promociona modelos automáticamente. –

0

Agregue un método GetAccountType() a sus cuentas corrientes y de ahorro, cuando recupere el objeto de BankAccount.objects.get() y luego llame, si todo lo que deriva de BankAccount tiene ese método, entonces estará bien .

+1

'BankAccount.objects.get()' devuelve un objeto 'BankAccount'. Siempre. –

+0

Tienes razón, pensé que estaba usando algo similar en mi propio código pero revisé y solo hago consultas basadas en la clase derivada. –

Cuestiones relacionadas