2010-02-22 44 views
9

我有一個名爲BankAccount的類作爲基類。我也有CheckingAccountSavingsAccount類從BankAccount繼承。如何確定Django模型中類的實例是否是另一個模型的子類?

BankAccount不是抽象類,但我不從它創建一個對象,只有繼承類。

然後,我執行這樣的查詢:

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

我怎麼知道賬戶是CheckingAccountSavingsAccount

我現在做的方式是這樣的:

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

如果它存在,它是一個CheckingAccount,否則,它是一個SavingsAccount

+0

我有類似的問題。檢查我的方法! http://stackoverflow.com/questions/12411232/django-multi-table-inheritance-how-to-know-which-is-the-child-class-of-a-model – luistm 2012-09-17 12:47:04

回答

10

嘗試使用checkingaccountsavingsaccount屬性。它是一個不會炸燬。

+0

鏈接:http: //docs.djangoproject.com/en/1.1/topics/db/models/#id7 – 2010-02-22 23:26:54

+1

如果僅在運行時才知道屬性名稱,該怎麼辦? – 2011-08-14 12:53:41

+0

在運行時,假設您選擇了名爲'account'的基礎'BankAccount'對象,並且變量屬性名稱爲'attr_name'。運行'hasattr(account,attr_name)',如果存在該類型的子類,則會變爲True;如果沒有,則返回False。 – Furbeenator 2015-02-05 18:55:15

-2

有點janky,但是這會工作:

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

'type(x)== SavingsAccount' does not同樣沒有創建一個新的對象。 – 2010-02-22 23:28:18

+3

如果您從'BankAccount'查詢,這將會失敗。 Django不會自動推廣模型。 – 2010-02-22 23:44:58

0

當您從BankAccount.objects.get()中取回對象時,在您的Checking and Savings帳戶中添加一個GetAccountType()方法,然後調用該方法,如果從BankAccount派生的所有內容都具有該方法,那麼您將沒事。

+1

'BankAccount.objects.get()'返回一個'BankAccount'對象。總是。 – 2010-02-23 00:26:42

+0

你說得對,我以爲我在我自己的代碼中使用了類似的東西,但我查了一下,我只是根據派生類進行查詢。 – 2010-02-23 03:31:47

相關問題