2013-07-23 74 views
28

我終於將我的項目發佈到生產級別,突然間我有一些問題在開發階段從來沒有處理過。Django錯誤匹配查詢不存在

當用戶發佈一些操作時,我有時會得到以下錯誤。

Traceback (most recent call last): 

    File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 111, in get_response 
    response = callback(request, *callback_args, **callback_kwargs) 

    File "home/ubuntu/server/opineer/comments/views.py", line 103, in comment_expand 
    comment = Comment.objects.get(pk=comment_id) 

    File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 131, in get 
    return self.get_query_set().get(*args, **kwargs) 

    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 366, in get 
    % self.model._meta.object_name) 

DoesNotExist: Comment matching query does not exist 

真正讓我很沮喪的是,該項目在本地環境中正常工作,此外,匹配的查詢對象不存在於數據庫中。

現在我懷疑用戶訪問數據庫時,它保留給其他用戶,但沒有辦法證明我的論點,也沒有任何解決方案。

有沒有人有過這種問題?有關如何解決此問題的任何建議?

非常感謝您的幫助提前。

編輯:我手動查詢數據庫使用從我收到的服務器錯誤電子郵件檢索到的相同信息。我沒有任何問題就能夠入場。此外,似乎用戶執行的行爲完全不會在大多數情況下引發任何問題,而是在一些(這仍然是未知的)情況下。總之,它肯定不是數據庫中缺少條目的問題。

+1

顯然,這是一個數據問題:'評論= Comment.objects.get(PK = COMMENT_ID)'驗證數據庫 – karthikr

+1

「蟒蛇manage.py sqlall存在的ID 「將生成對應於您的模型的SQL。檢查它是否對應於數據庫模式SQL。例如,如果使用PostgreSQL,它也可能是一個序列問題。總之:您能否提供更多關於您的環境的信息(SQDB,DB,DB中的對應表和models.py中的代碼,...)? – Ricola3D

+0

@ Ricola3D Hello Ricola,我目前使用從Amazon EC2實例託管它的MySql DB。我暫時使用內置的Django Comment。與此同時,我會嘗試運行您建議的sqlall命令。謝謝。 –

回答

40

你行上調錯誤是在這裏:

comment = Comment.objects.get(pk=comment_id) 

您嘗試訪問一個不存在的註釋。

from django.shortcuts import get_object_or_404 

comment = get_object_or_404(Comment, pk=comment_id) 

而不必在服務器上的錯誤,你的用戶會得到一個404這意味着他試圖訪問一個不存在的資源。

好吧,在這裏,我想你知道這一點。

有些用戶(我是他們的一部分)讓標籤長時間運行,如果用戶有權刪除數據,可能會發生。與向管理員發送電子郵件相比,404錯誤可能是處理已刪除資源錯誤的更好的錯誤。

其他用戶從他們的歷史記錄中找到地址(如果數據已被刪除,則可能發生)。

+1

長時間運行的選項卡上的+1。通過舊標籤404發生在我身上很多。 –

+0

謝謝克里斯的建議。真正困擾我的是,當我手動查詢MySql數據庫時(使用從服務器收到的錯誤信息),我確實打了正確的條目,沒有任何問題。此外,同樣的操作有時會拋出DoesNotExist異常,但在其他時間大多數情況下都是如此。它似乎不像數據庫中缺少條目的問題:( –

+0

我可能有更少的用戶,但使用postgres我從來沒有遇到過這種問題。我們確實沒有太多的信息,數據庫沒有從屬/主集羣?你不在查詢集上使用緩存? – christophe31

10

您可以使用此:

comment = Comment.objects.filter(pk=comment_id) 
+0

那麼,如果有特定的對象,那麼你不能使用過濾器,因爲它可能會返回空列表如果查詢不匹配。當它匹配時,你必須使用列表中的第一個對象。 – Jay

29

也許你有這樣的主鍵沒有評論記錄,那麼你應該使用此代碼:

try: 
    comment = Comment.objects.get(pk=comment_id) 
except Comment.DoesNotExist: 
    comment = None 
+0

這一個幫助我。謝謝 – jned29

1

你可以試試這個方法。只需使用一個函數來獲取你的對象

def get_object(self, id): 
    try: 
     return Comment.objects.get(pk=id) 
    except Comment.DoesNotExist: 
     return False