2013-04-20 88 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