Как я могу определить, является ли экземпляр класса из модели Django подклассом другой модели? - PullRequest
10 голосов
/ 23 февраля 2010

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

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

Затем я выполняю запрос, подобный следующему:

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

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

Способ, которым я делаю это сейчас, заключается в следующем:

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

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

Ответы [ 5 ]

10 голосов
/ 23 февраля 2010

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

2 голосов
/ 23 февраля 2010

Вы можете использовать <a href="http://www.python.org/doc/2.3/lib/built-in-funcs.html" rel="nofollow noreferrer">isinstance</a>(account, SavingsAccount), но обычно предпочитаете , чтобы избежать его и использовать вывод типа утки , посмотрев на атрибуты объекта и посмотрев, крякает ли он как подкласс.

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

0 голосов
/ 15 сентября 2013

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

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

0 голосов
/ 23 февраля 2010

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

0 голосов
/ 23 февраля 2010

Немного дергается, но это сработает:

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