Как определить, является ли экземпляр класса из модели Django подклассом другой модели?

У меня есть класс под названием BankAccount как базовый класс. У меня также есть классы CheckingAccount и SavingsAccount которые наследуются от BankAccount .

BankAccount не является абстрактным классом, но я не создаю из него объект, а только наследующие классы.

Затем я выполняю такой запрос:

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

Как узнать, является ли учетная запись CheckingAccount или SavingsAccount ?

То, как я делаю это сейчас, заключается в следующем:

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

Если он существует, это CheckingAccount , в противном случае это SavingsAccount .

Попробуйте использовать атрибуты savingsaccount и savingsaccount . Тот, который он не взорвется.

Вы можете использовать isinstance (account, SavingsAccount) , но обычно предпочитаете его избегать и использовать вывод типа утки , просматривая атрибуты объекта и isinstance (account, SavingsAccount) ли он как подкласс.

Чтобы узнать, имеет ли объект атрибут , вы используете hasattr функцию hasattr встроенную функцию, или используйте getattr и проверяете повышение исключения AttributeError.

Добавьте метод GetAccountType () к своим учетным записям и сбережениям, когда вы вернете объект из BankAccount.objects.get (), затем вызовите это, если все, что вытекает из BankAccount, имеет этот метод, тогда все будет в порядке.

После некоторого поиска я нашел решения, схожие с этим: наследование Django multi-table, как узнать, который является дочерним классом модели?

В принципе, для этого нет элегантного решения. Вы должны сделать кучу утверждений try-except и заставить django использовать нужный вам класс.

Немного судорожно, но это сработало бы:

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