我有一个名为BankAccount
的类作为基类。我还有CheckingAccount
和SavingsAccount
类继承自BankAccount
。
BankAccount不是一个抽象类,但我不是从它创建一个对象,只是继承类。
然后,我执行这样的查询:
account = BankAccount.objects.get(id=10)
我如何知道帐户是CheckingAccount
还是SavingsAccount
?
我现在这样做的方式就是这样:
checking_account = CheckingAccount.objects.get(id=account.id)
如果存在,则为CheckingAccount
,否则为SavingsAccount
。
答案 0 :(得分:10)
尝试使用checkingaccount
和savingsaccount
属性。它不会爆炸。
答案 1 :(得分:2)
您可以使用isinstance(account, SavingsAccount)
,但generally preferred to avoid it并使用duck type inference查看对象的属性,看看它是否像子类一样嘎嘎作响。
要查看是否object has an attribute,您使用名称恰当的hasattr
built-in function或使用getattr
并检查是否引发了AttributeError异常。
答案 2 :(得分:0)
将GetAccountType()方法添加到您的支票和储蓄帐户,当您从BankAccount.objects.get()获取对象然后调用它,如果从BankAccount派生的所有内容都有该方法,那么您将没事。
答案 3 :(得分:0)
经过一番搜索,我找到了类似于此的解决方案: Django multi-table inheritance, how to know which is the child class of a model?
基本上,没有优雅的解决方案。你必须做一堆try-except语句并强制django使用你想要的类。
答案 4 :(得分:-2)
有点笨拙,但这可行:
>>> class BankAccount(object): pass
...
>>> class SavingsAccount(BankAccount): pass
...
>>> class CheckingAccount(BankAccount): pass
...
>>> x = SavingsAccount()
>>> type(x) == type(SavingsAccount())
True
>>> type(x) == type(CheckingAccount())
False