2013-04-20 113 views
3

我有一個User對象和一個UserInfo對象,它們具有一對一的關係。我只是添加UserInfo對象,因此某些用戶已經有User對象,但不包含UserInfo對象。我想檢查用戶對象是否有一個UserInfo對象與它關聯,如果沒有重定向到一個頁面,我可以得到一些信息。我還是新的蟒蛇,並嘗試做一個if request.user.user_info:它拋出一個異常,當它不存在,所以我落得這樣做的:Python Django檢查屬性是否存在或已設置

user = request.user 
    try: 
     user.user_info.university 
    except: 
     print 'redirect to info page' 

,工作正常,但我覺得異常應該是例外和不用於if語句替代。有一個更好的方法嗎?

+8

嘗試'hasattr(用戶, 'USER_INFO')'和' 'USER_INFO' 在user'。 – Blender 2013-04-20 20:31:38

+0

另一件需要考慮的事情是,如果每個用戶都應該有一個'UserInfo'對象,您可以訂閱用戶創建信號併爲每個創建的用戶自動初始化一個'UserInfo'對象。 https://docs.djangoproject.com/zh/dev/topics/signals/ – dm03514 2013-04-20 20:34:59

+1

http://stackoverflow.com/questions/610883/how-to-know-if-an-object-has-an-attribute-in -python – phazei 2013-09-26 02:49:03

回答

6

我會說,處理異常是pythonic方法。你可以做這樣的事情:

try: 
    # do your thing when user.user_info exists 
except AttributeError: # Be explicit with catching exceptions. 
    # Redirect. 

有一個稱爲it's easier to ask for forgiveness than permission (EAFP)這是在Python廣泛用於編程的概念。我們假設某個給定對象的屬性,鍵等存在,當它們不存在時會捕獲異常。

以下是一些有關EAFP的參考和SO問題。

Python glossary
What is the EAFP principle in Python
EAFP and what is really exceptional

+1

也可以使用python hasattr() – radtek 2015-02-06 20:46:43