我没有接受过非常全面的python培训,有时候也不知道正确的做事方式。其中一件事就是测试我的resultQuery是否返回了结果。我发现自己做了很多这样的事情:
try:
user = User.objects.get(email=email)
except DoesNotExist:
user = User()
我不知道python但是尝试使用其他语言捕获应该是异常而不是正常的程序流。你怎么用if if呢? 我想我想要类似的东西:
if request.GET.get('email','') is not None:
email = request.GET['email'])
答案 0 :(得分:4)
您的异常示例通常是首选的方法。 Wikipedia对此有很好的描述:
Python样式调用错误时使用异常 情况可能会出现。而不是测试对文件的访问权限 在实际使用它之前的资源,它在Python中是常规的 继续尝试使用它,如果访问是捕获异常 拒绝。
异常通常用作if块的替代方法 (......)。一个常用的座右铭是EAFP,或者“它更易于询问 宽恕而不是许可。“
Python中的异常并不一定代价高昂。再次引用维基百科的例子:
if hasattr(spam, 'eggs'):
ham = spam.eggs
else:
handle_error()
......对:
try:
ham = spam.eggs
except AttributeError:
handle_error()
这两个代码示例具有相同的效果,但会有性能差异。当垃圾邮件具有属性egg时,EAFP样本将运行得更快。当垃圾邮件没有属性egg(“例外”情况)时,EAFP样本将运行得更慢。
特别是对于Django,我会使用异常示例。这是在该框架中做事的标准方式,遵循标准从来都不是坏事:)。
答案 1 :(得分:0)
您可以使用.filter()
代替.get()
,也可以使用django的优化查询集评估。
你可以做到
qs = User.objects.filter(email=email)
if qs :
user = qs[0]
...
答案 2 :(得分:0)
Django定义了一个类EmptyQuerySet
,当需要进行严格的isinstance(...)
测试时,它可用于特殊实现。
一种直截了当的方式如下:
try:
user = User.objects.get(email=email)
if user:
# ...
else:
# ...
except DoesNotExist:
user = User()
Django提供了一个get
方法来直接检索单个Model实例或引发Exception。在这种情况下,通常的方法是检查DoesNotExist
要像往常一样从数据库查询中检索整个行,请使用user.objects.filter(...)
方法。返回的QuerySet
实例为您提供了.count()
,.exists()
方法。
答案 3 :(得分:0)
我同意捕获异常是这里的正常模式。如果确实需要检查查询集是否返回结果,exists
方法是一种方法,我认为还没有提到。文档贯穿各种性能含义,最值得注意的是,如果您知道将对查询集进行求值,那么最好只检查查询集的布尔解释。