如何确定Django模型中的类实例是否是另一个模型的子类?

时间:2010-02-22 23:21:58

标签: python django inheritance django-models subclass

我有一个名为BankAccount的类作为基类。我还有CheckingAccountSavingsAccount类继承自BankAccount

BankAccount不是一个抽象类,但我不是从它创建一个对象,只是继承类。

然后,我执行这样的查询:

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

我如何知道帐户是CheckingAccount还是SavingsAccount

我现在这样做的方式就是这样:

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

如果存在,则为CheckingAccount,否则为SavingsAccount

5 个答案:

答案 0 :(得分:10)

尝试使用checkingaccountsavingsaccount属性。它不会爆炸。

答案 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