Django 오류-일치하는 쿼리가 없습니다.


92

마침내 프로젝트를 프로덕션 수준으로 출시했고 갑자기 개발 단계에서 처리 할 수 ​​없었던 문제가 몇 가지 생겼습니다.

사용자가 일부 작업을 게시 할 때 가끔 다음과 같은 오류가 발생합니다.

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가 데이터베이스에 존재 확인
karthikr

3
"python manage.py sqlall"은 모델에 해당하는 SQL을 생성합니다. DB 스키마 SQL에 해당하는지 확인합니다. 예를 들어 PostgreSQL로 작업하는 경우 순서 문제가 될 수도 있습니다. 결론 : 환경 (SQDB, DB, DB의 해당 테이블 및 models.py의 코드, ...)에 대한 더 많은 정보를 가져올 수 있습니까?
Ricola3D

@ Ricola3D 안녕하세요 Ricola, 저는 현재 Amazon EC2 인스턴스에서 호스팅하는 MySql DB를 사용하고 있습니다. 그리고 당분간 내장 된 Django Comment를 사용하고 있습니다. 그동안 제안하신 sqlall 명령을 실행 해 보겠습니다. 감사합니다.
Chris P

답변:


97

오류를 일으키는 줄은 다음과 같습니다.

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는 나에게 많이 발생합니다.
Yuji 'Tomita'Tomita

제안 해 주셔서 감사합니다. 정말로 나를 괴롭히는 것은 MySql 데이터베이스를 수동으로 쿼리 할 때 (서버에서받은 오류 정보를 사용하여) 문제없이 올바른 항목을 입력한다는 것입니다. 또한 동일한 작업이 때때로 DoesNotExist 예외를 throw하지만 대부분의 경우 작동합니다. 데이터베이스에서 누락 된 항목에 대한 문제가 아닌 것 같습니다. (
Chris P

사용자 수가 적을 수 있지만 postgres에서는 이런 종류의 문제가 없었습니다. 우리는 정말로 많은 정보를 가지고 있지 않습니다. 당신의 데이터베이스에는 슬레이브 / 마스터 클러스터링이 없습니까? 쿼리 세트에 캐시를 사용하지 않습니까?
christophe31

@ christophe31 그래서 저는 아직 어떤 종류의 DB 성능 최적화도 구현하지 않았고 슬레이브 / 마스터 클러스터링이나 쿼리 셋에 대한 캐싱과 같은 방법을 백업하지도 않았습니다. 이러한 기능을 구현하고 문제가 지속되는지 확인하겠습니다.
Chris P

2
또한 당신은 캐치이를 추가 할 수 있습니다 : from django.db import connection, connection.connection.close(), connection.connection = NoneDB 연결을 재설정하고 새로운 하나를 시작하려고 할 수 있습니다.
christophe31

106

이러한 기본 키가있는 Comments 레코드가 없을 수도 있습니다. 다음 코드를 사용해야합니다.

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

3
이러한 경우에 가장 좋은 옵션입니다. 사용자에게 404를 던지는 대신 오류를 포착하고 미리 구성된 멋진 메시지를 표시합니다. 심장이 타지 않습니다.
user12379095

여기서 어떻게 작동할까요? def previous_job(self): return self.get_previous_by_start_dt(brand=self.brand, status='finished') or None여기에서 try catch를 구현하는 방법을 모릅니다
snh_nl

22

이것을 사용할 수 있습니다 :

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

글쎄, 원하는 특정 개체가 있으면 필터를 사용할 수 없습니다. 쿼리가 일치하지 않으면 빈 목록을 반환 할 수 있습니다. 일치하면 목록에서 첫 번째 개체를 사용해야합니다.
Jay Modi

3
아마도 그게 요점 일 것입니다. 예외를 생성하는 대신 필터를 사용하고 결과에 항목이 0 개 또는 1 개 있는지 테스트 하시겠습니까?
Mike 'Pomax'Kamermans

Model.objects.filterQueryset Model.objects.get을 반환하는 반면 객체를 반환 한다는 점 은 주목할 가치가 있습니다. 객체가 존재하지 않으면 전자는 빈 쿼리 셋을 반환하고 후자는 Model.DoesNotExist오류를 발생시킵니다.
ron_g

Comment.objects.filter(pk=comment_id).first()None기록이 없으면 반환 됩니다.
steezeburger 19 dec

12

이 방법으로 시도 할 수 있습니다. 객체를 얻기 위해 함수를 사용하십시오.

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.