¿Cómo puedo determinar si la instancia de clase del modelo Django es una subclase de otro modelo?

Tengo una clase llamada BankAccount como clase base. También tengo clases CheckingAccount y SavingsAccount que heredan de BankAccount .

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

Luego, ejecuto una consulta como esta:

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

¿Cómo puedo saber 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, es una SavingsAccount CheckingAccount , de lo contrario, es una SavingsAccount .

Trate de usar los atributos de savingsaccount checkingaccount y cuenta de savingsaccount . El que es no estallará.

Podría usar isinstance (account, SavingsAccount) , pero generalmente se prefiere evitarlo y usar la inferencia de tipo pato mirando los atributos del objeto, y ver si funciona como una subclase.

Para ver si un objeto tiene un atributo , use la hasattr incorporada hasattr llamada apropiadamente o use getattr y verifique la getattr de una excepción AttributeError.

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

Después de buscar más, encontré soluciones similares a esto: la herencia de tablas múltiples de Django, ¿cómo saber cuál es la clase hija de un modelo?

Básicamente, no hay una solución elegante para esto. Tienes que hacer un montón de declaraciones try-except y forzar a django a usar la clase que quieras.

Un poco de 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