2010-02-22 30 views
9

Tôi có một lớp được gọi là BankAccount làm lớp cơ sở. Tôi cũng có các lớp học CheckingAccountSavingsAccount được kế thừa từ BankAccount.Làm thế nào tôi có thể xác định nếu trường hợp của lớp từ mô hình Django là phân lớp của một mô hình khác?

BankAccount không phải là lớp trừu tượng nhưng tôi không tạo đối tượng từ lớp đó, chỉ có các lớp kế thừa.

Sau đó, tôi thực hiện một truy vấn như thế này:

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

Làm thế nào để tôi biết nếu tài khoản là CheckingAccount hoặc SavingsAccount?

Cách tôi làm điều này bây giờ là theo cách này:

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

Nếu nó tồn tại, nó là một CheckingAccount, nếu không, nó là một SavingsAccount.

+0

Tôi đang gặp sự cố tương tự. Kiểm tra cách tiếp cận của tôi! http://stackoverflow.com/questions/12411232/django-multi-table-inheritance-how-to-know-which-is-the-child-class-of-a-model – luistm

Trả lời

10

Hãy thử sử dụng thuộc tính checkingaccountsavingsaccount. Cái nó sẽ không nổ tung.

+0

Liên kết: http: //docs.djangoproject.com/en/1.1/topics/db/models/#id7 –

+1

Điều gì sẽ xảy ra nếu tên thuộc tính chỉ được biết khi chạy? –

+0

Khi chạy, giả sử bạn đã chọn đối tượng 'BankAccount' cơ sở có tên' tài khoản' và tên thuộc tính biến là 'attr_name'. Chạy 'hasattr (tài khoản, attr_name)' và bạn sẽ nhận được True nếu có một lớp con của kiểu đó, hoặc False nếu nó không. Liên kết – Furbeenator

-2

Một janky chút, nhưng điều này sẽ làm việc:

>>> 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' thực hiện giống nhau mà không cần tạo một đối tượng mới. –

+3

Điều này sẽ không thành công nếu bạn đang truy vấn từ 'BankAccount'. Django không tự động quảng bá mô hình. –

2

Bạn có thể sử dụng isinstance (account, SavingsAccount), nhưng là generally preferred to avoid it và sử dụng duck type inference bằng cách nhìn vào các thuộc tính của đối tượng, và xem nếu nó quacks như một lớp con.

Để xem nếu object has an attribute, bạn sử dụng tên thích hợp hasattr built-infunction hoặc sử dụng getattr và kiểm tra việc tăng ngoại lệ AttributeError.

+1

Một lần nữa, sẽ không hoạt động nếu bạn đang truy vấn 'BankAccount'. –

0

Thêm phương thức GetAccountType() vào tài khoản Kiểm tra và tiết kiệm của bạn, khi bạn lấy đối tượng trở lại từ BankAccount.objects.get() rồi gọi, nếu mọi thứ có nguồn gốc từ BankAccount có phương pháp đó thì bạn sẽ ổn .

+1

'BankAccount.objects.get()' trả về một đối tượng 'BankAccount'. Luôn luôn. –

+0

Bạn nói đúng, tôi nghĩ rằng tôi đã sử dụng một cái gì đó tương tự trong mã của riêng tôi nhưng tôi đã kiểm tra và tôi chỉ bao giờ làm các truy vấn dựa trên lớp dẫn xuất. –

Các vấn đề liên quan