1. ホーム
  2. database

[解決済み] Django エラー - 一致するクエリが存在しません。

2022-02-18 09:30:20

質問

プロジェクトをようやく本番稼動させたのですが、突然、開発段階では対処する必要のなかった問題が発生しました。

ユーザーが何らかのアクションを投稿すると、以下のようなエラーが発生することがあるのですが。

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

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

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

このような問題が発生したことがある方はいらっしゃいますか?この問題を解決する方法について、何か提案があれば教えてください。

よろしくお願いします。

EDIT: 受信したサーバーエラーのメールから取得した同じ情報を使って、手動でデータベースに照会してみました。問題なくエントリーをヒットさせることができました。さらに、ユーザーが行ったのと全く同じ動作でも、ほとんどの場合は問題が発生せず、むしろ一部の(まだ知られていない)ケースで問題が発生するようです。結論から言うと、間違いなくデータベースの欠落したエントリーの問題ではありません。

解決方法は?

エラーが発生した行はここです。

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エラーは、管理者にメールを送るよりも、削除されたリソースのエラーを処理するためのより良いエラーであるかもしれません。

他のユーザーが履歴からアドレスに移動する(データが削除されている場合も同じことが起こる可能性があるため)。