Python Django检查属性是否存在或已设置

7

我有一个User对象和一个UserInfo对象,它们之间是一对一的关系。我正在添加UserInfo对象,因此有些用户已经拥有User对象而没有UserInfo对象。我想检查用户对象是否已经与UserInfo对象关联,如果没有,则重定向到一个页面,以便获取一些信息。我还不熟悉Python,尝试使用if request.user.user_info:语句,但当它不存在时会抛出异常,所以我最终使用了以下代码:

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

这个方法可以正常工作,但我认为异常应该只用于异常情况,而不是用作if语句的替代品。有没有更好的方法来解决这个问题?


9
尝试使用hasattr(user, 'user_info')'user_info' in user - Blender
另一个需要考虑的事情是,是否每个用户都应该拥有一个UserInfo对象。您可以订阅用户创建信号,并自动为每个创建的用户初始化一个UserInfo对象。https://docs.djangoproject.com/en/dev/topics/signals/ - dm03514
1
https://dev59.com/LHRB5IYBdhLWcg3weXOX - phazei
1个回答

13

我认为使用异常处理是Python中的一种典型方法。可以像这样实现:

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

有一个编程概念叫做 宁愿请求宽恕,而不是事先获准 (EAFP) 在Python中被广泛使用。我们假设给定对象的属性、键等存在,如果不存在则捕获异常。

下面是一些关于EAFP的参考资料和SO问题。

Python词汇表
Python中的EAFP原则是什么
EAFP和真正异常的含义


1
可以使用Python的hasattr()函数。 - radtek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接