Python django如何正确测试查询集是否返回了结果

时间:2013-09-07 18:18:52

标签: python django

我没有接受过非常全面的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'])

4 个答案:

答案 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方法是一种方法,我认为还没有提到。文档贯穿各种性能含义,最值得注意的是,如果您知道将对查询集进行求值,那么最好只检查查询集的布尔解释。