web-dev-qa-db-ja.com

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

私が本当にイライラするのは、プロジェクトがローカル環境で正常に機能し、さらに、一致するクエリオブジェクトがデータベースに存在することです。

今、私はユーザーが他のユーザーに予約されているときにデータベースにアクセスしているのではないかと疑っていますが、私の議論を証明する方法も解決策もありません。

誰も以前にこの種の問題を抱えていましたか?この問題を解決する方法に関する提案はありますか?

よろしくお願いします。

編集:私は私が受け取ったサーバーエラーメールから取得した同じ情報を使用して、手動でデータベースを照会しました。問題なくエントリーできました。さらに、ユーザーが実行したのとまったく同じ動作では、ほとんどの場合問題が発生しないようですが、一部の(まだ不明な)場合に発生します。結論として、それは間違いなくデータベースのエントリが欠落している問題ではありません。

60
Chris P

エラーが発生した行は次のとおりです。

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エラーは、管理者にメールを送信するよりも、削除されたリソースのエラーを処理するのに適したエラーです。

他のユーザーは、履歴からアドレスにアクセスします(データが発生する可能性があるためにデータが削除された場合も同じです)。

59
christophe31

そのような主キーを持つコメントレコードがない場合は、次のコードを使用する必要があります。

try:
    comment = Comment.objects.get(pk=comment_id)
except Comment.DoesNotExist:
    comment = None
70
Dracontis

これを使用できます:

comment = Comment.objects.filter(pk=comment_id)
16
Klang Wutcharin

この方法を試すことができます。関数を使用してオブジェクトを取得するだけです

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