2016-12-01 29 views
6

我对django exists()DoesNotExist有一些疑问。Django exists()与DoesNotExist

示例代码:

id = 1 
# first 
if User.objects.get(pk=id).exists(): 
    # my logic 
    pass 
# second 
try: 
    User.objects.get(pk=id) 
    # my logic 
    pass 
except User.DoesNotExist: 
    return 0 

我经常使用get()方法。哪种做法更好?哪个代码更好?第一或第二?

+1

可能的复制[什么是更有效的.objects.filter()存在()或get()和一试(HTTP://计算器。 com/questions/23562784/what-is-more-efficient-objects-filter-exists-or-get-and-a-try) – AKS

+0

'get(pk = id).exists()'_doesn't work_。如果它不存在,那么get()将抛出异常。 exists()仅适用于querysets,get()返回一个不是queryset的实例。 – RemcoGerlich

+0

哦对不起存在()是queryset方法。谢谢 –

回答

4

如果User.objects.get(PK = ID).exists()

这是行不通的,所以这个问题很容易回答:这种方式是逊色于哪种方式做工作:-)

我想你实际上没有做出Minimal Complete Verifiable Example,所以当你发布未经验证的代码时错过了错误。


所以不是,我想你问的区别:

的区别是:

  • QuerySet.exists方法是在查询集,这意味着你问它有关的查询,而你(“有没有任何实例匹配这个查询?”)还没有试图检索任何特定的实例。

  • 实际尝试检索一个实例并且它不存在时,将引发该模型的DoesNotExist异常。

使用哪一个正确表达你的意图。

0

可以在docs找到更多的信息: 约exists(),但只有在查询集包含任何结果,假如果不是exists()适用于查询集

返回true。这尽可能以最简单和最快的方式执行查询,但它确实执行与普通QuerySet查询几乎相同的查询。

exists()对于与QuerySet中的对象成员关系以及QuerySet中的任何对象(特别是在大型QuerySet的上下文中)的存在有关。

但是ObjectDoesNotExist只能与get()一起使用。你

也可以尝试另一种方法:的

user = User.objects.filter(id=2) 
if user: 
    # put your logic 
    pass