2016-12-01 31 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