2012-07-30 148 views
26

我需要檢查Model.objects.filter(...)是否出現任何內容,但不需要插入任何內容。到目前爲止我的代碼是:檢查對象是否存在

user_pass = log_in(request.POST) # form class 
if user_pass.is_valid(): 
    cleaned_info = user_pass.cleaned_data 
    user_object = User.objects.filter(email = cleaned_info['username']) 
+0

我不瞭解你想要做什麼。你是否試圖檢查用戶是否已經存在以提出錯誤?你爲什麼需要檢查?你爲什麼要在「表單視圖」中執行此操作?試着回答這個問題,看看我們能否更好地幫助你......給你的問題添加一個背景,而不僅僅是你想到的問題。有時候你認爲你的問題不是真正的問題,所以你問的問題是不正確的... – marianobianchi 2012-07-30 03:07:22

+0

可能重複[什麼是正確的方式來驗證,如果一個對象存在Django的觀點,而不返回404?]( http://stackoverflow.com/questions/639836/what-is-the-right-way-to-validate-if-an-object-exists-in-a-django-view-without-r) – Wtower 2017-04-17 19:39:30

回答

33

由於filter回報QuerySet,你可以用count檢查許多結果如何返回。這假設你並不需要結果。

num_results = User.objects.filter(email = cleaned_info['username']).count() 

在文檔雖然看後,最好只調用len你的過濾器,如果你在以後使用結果的規劃,因爲你只能做一個SQL查詢:

count()調用在後臺執行SELECT COUNT(*),所以您應該始終使用count(),而不是將所有記錄加載到Python對象中,並對結果調用len()(除非需要加載對象無論如何,在這種情況下len()會更快)。

num_results = len(user_object) 
+50

雖然'。 count()'確實有效,你也可以使用'.exists()'。 https://docs.djangoproject.com/en/dev/ref/models/querysets/#exists – 2012-07-30 02:17:25

+3

我想添加上面的評論,雖然.count()確實有效,但它會比.exists()if慢計數> 1,計數越大,它將變得越慢 – Bob 2014-10-02 04:26:52

5

您還可以使用get_object_or_404(),它會提高一個Http404如果未找到對象:

user_pass = log_in(request.POST) #form class 
if user_pass.is_valid(): 
    cleaned_info = user_pass.cleaned_data 
    user_object = get_object_or_404(User, email=cleaned_info['username']) 
    # User object found, you are good to go! 
    ... 
4

空查詢集的布爾值也爲False,所以你也可以只是做...

... 
if not user_object: 
    do insert or whatever etc. 
+2

這不是非常有效,因爲它會評估查詢,並且當對象存在時它會將它們加載到內存中 – mpaf 2014-02-13 09:50:00

2

您可以使用:

try: 
    # get your models 
except ObjectDoesNotExist: 
    # do something