[database] 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
정말 실망스러운 것은 프로젝트가 로컬 환경에서 잘 작동하고 또한 일치하는 쿼리 개체가 데이터베이스에 존재한다는 것입니다.
이제 사용자가 다른 사용자에게 예약 된 데이터베이스에 액세스하고 있다고 생각하지만 내 주장을 증명할 방법도없고 이에 대한 해결책도 없습니다.
전에 이런 종류의 문제가 있었던 사람이 있습니까? 이 문제를 해결하는 방법에 대한 제안 사항이 있습니까?
미리 도와 주셔서 감사합니다.
편집 :받은 서버 오류 이메일에서 검색 한 것과 동일한 정보를 사용하여 데이터베이스를 수동으로 쿼리했습니다. 나는 아무 문제없이 엔트리를 칠 수 있었다. 또한 사용자가 수행 한 것과 똑같은 행동이 대부분의 경우 문제를 일으키지 않고 일부 (아직 알려지지 않은) 경우에 발생하는 것처럼 보입니다. 결론적으로, 데이터베이스에서 누락 된 항목이 문제가되지는 않습니다.
답변
오류를 일으키는 줄은 다음과 같습니다.
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 오류는 관리자에게 이메일을 보내는 것보다 삭제 된 리소스 오류를 처리하는 데 더 나은 오류 일 수 있습니다.
다른 사용자는 기록에서 주소로 이동합니다 (데이터가 발생할 수 있기 때문에 삭제 된 경우에도 동일).
답변
이러한 기본 키가있는 Comments 레코드가 없을 수도 있습니다. 다음 코드를 사용해야합니다.
try:
comment = Comment.objects.get(pk=comment_id)
except Comment.DoesNotExist:
comment = None
답변
이것을 사용할 수 있습니다 :
comment = Comment.objects.filter(pk=comment_id)
답변
이 방법으로 시도 할 수 있습니다. 객체를 얻기 위해 함수를 사용하십시오.
def get_object(self, id):
try:
return Comment.objects.get(pk=id)
except Comment.DoesNotExist:
return False