Djangoエラー-一致するクエリが存在しません


97

私はついにプロジェクトを本番レベルにリリースしましたが、突然、開発段階で対処する必要がなかったいくつかの問題が発生しました。

ユーザーがいくつかのアクションを投稿すると、次のエラーが発生することがあります。

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

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

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

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

よろしくお願いします。

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


2
明らかに、これはデータの問題ですcomment = Comment.objects.get(pk=comment_id)
。ID

3
「pythonmanage.pysqlall」は、モデルに対応するSQLを生成します。DBスキーマSQLに対応しているか確認してください。たとえばPostgreSQLを使用している場合、シーケンスの問題になる可能性もあります。結論:環境に関する詳細情報(SQDB、DB、DB内の対応するテーブル、models.py内のコードなど)を提供できますか?
ricola3D 2013

@ Ricola3Dこんにちはリコラ、私は現在、AmazonEC2インスタンスからそれをホストしているMySqlDBを使用しています。とりあえず、組み込みのDjangoCommentを使用しています。それまでの間、提案されたsqlallコマンドを実行してみます。ありがとうございました。
クリスP

回答:


104

エラーを発生させるあなたの行はここにあります:

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

他のユーザーは自分の履歴からアドレスにアクセスします(データが削除された場合も同様です)。


3
長時間実行されているタブで+1。古いタブを介した404は私によく起こります。
ゆうじ '冨田'冨田

あなたの提案をありがとうクリス。本当に気になるのは、MySqlデータベースに手動でクエリを実行すると(サーバーから受け取ったエラー情報を使用して)、問題なく正しいエントリにアクセスできることです。また、同じアクションでDoesNotExist例外がスローされることもありますが、それ以外の場合はほとんど機能します。データベースにエントリがないという問題ではないようです:(
Chris P

ユーザー数は少ないかもしれませんが、postgresではこのような問題は発生しませんでした。私たちは本当に多くの情報を持っていません、あなたのデータベースはスレーブ/マスタークラスタリングを持っていませんか?クエリセットでキャッシュを使用しませんか?
christophe31 2013

@ christophe31ですから、私はまだDBパフォーマンスの最適化を実際に実装しておらず、スレーブ/マスターのクラスタリングやクエリセットのキャッシュなどのバックアップ方法も実装していません。これらの機能を実装して、問題が解決するかどうかを確認すると思います。
クリスP

2
また、あなたはキャッチでこれを追加する可能性があります。from django.db import connectionconnection.connection.close()connection.connection = NoneDB接続をリセットし、新しいものから開始しようとします。
christophe31 2013

111

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

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

3
そのような場合の最良の選択肢。ユーザーに404をスローする代わりに、エラーをキャッチして、事前に構成された適切なメッセージを表示します。火傷はありません。
user123790 9520

ここではどのように機能しますか?def previous_job(self): return self.get_previous_by_start_dt(brand=self.brand, status='finished') or Noneここでトライキャッチを実装する方法を知らない
snh_nl

26

あなたはこれを使うことができます:

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

さて、必要な特定のオブジェクトがある場合、クエリが一致しない場合は空のリストを返す可能性があるため、フィルタを使用することはできません。そしてそれが一致したとき、あなたはリストから最初のオブジェクトを使わなければなりません。
ジェイ・モディ

3
おそらくそれがポイントです。例外を生成する代わりに、フィルターを使用して、結果に0または1つのエントリがあるかどうかをテストしますか?
Mike'Pomax 'Kamermans18年

注目に値するのModel.objects.filterは、クエリセットModel.objects.getを返すのに対し、オブジェクトを返すことです。オブジェクトが存在しない場合、前者は空のクエリセットを返し、後者はModel.DoesNotExistエラーになります。
ron_g

Comment.objects.filter(pk=comment_id).first()Noneレコードが見つからない場合は戻ります。
steezeburger

15

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

def get_object(self, id):
    try:
        return Comment.objects.get(pk=id)
    except Comment.DoesNotExist:
        return False
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.