2013-07-23 18 views
28

W końcu opublikowałem swój projekt na poziomie produkcji i nagle mam pewne problemy, z którymi nigdy nie miałem do czynienia w fazie rozwoju.Błąd Django - pasujące zapytanie nie istnieje

Kiedy użytkownicy publikują niektóre akcje, czasami pojawia się następujący błąd.

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 

Co naprawdę mnie irytuje to, że projekt działa dobrze w środowisku lokalnym, a ponadto przedmiotem zapytania dopasowanie NIE istnieje w bazie danych.

Teraz podejrzewam, że użytkownik uzyskuje dostęp do bazy danych, gdy jest zarezerwowany dla innych użytkowników, ale nie ma sposobu na udowodnienie mojej argumentacji ani nie mam żadnego rozwiązania.

Czy ktoś wcześniej miał takie problemy? Wszelkie sugestie, jak rozwiązać ten problem?

Dziękuję bardzo za pomoc z góry.

EDYCJA: Ręcznie przeszukałem bazę danych, używając tych samych informacji pobranych z otrzymanego przeze mnie komunikatu o błędzie serwera. Udało mi się trafić bez żadnych problemów. Co więcej, wydaje się, że dokładnie to samo zachowanie, które wykonał użytkownik, nie wywołuje większości problemów przez większość czasu, ale raczej w niektórych (które jeszcze nie są znane). Podsumowując, zdecydowanie nie jest to problem z brakującym wpisem do bazy danych.

+1

Oczywiście, jest to kwestia danych: 'comment = Comment.objects.get (pk = comment_id)' zweryfikować identyfikator istnieje w „python manage.py sqlall bazie – karthikr

+1

"wygeneruje kod SQL odpowiadający twoim modelom. Sprawdź, czy odpowiada on schematom bazy danych SQL. W przypadku pracy z PostgreSQL na przykład, może to być również kwestia kolejności. Podsumowując: można przynieść więcej informacji o środowisku (SQDB dB, co odpowiada tabeli w DB i kod w models.py, ...)? – Ricola3D

+0

@ Ricola3D Witaj Ricola, obecnie używam MySql DB hostując go z instancji Amazon EC2. I na razie używam wbudowanego komentarza Django. W międzyczasie spróbuję uruchomić polecenie sqlall, które zasugerowałeś. Dziękuję Ci. –

Odpowiedz

40

linia podniesienie błąd jest tutaj:

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

próby uzyskania dostępu do nieistniejącego komentarza.

from django.shortcuts import get_object_or_404 

comment = get_object_or_404(Comment, pk=comment_id) 

Zamiast błąd na serwerze, Twój użytkownik otrzyma 404 oznacza, że ​​próbuje uzyskać dostęp do nieistniejących zasobu.

Ok maksymalnie tutaj Przypuszczam, że są tego świadomi.

Niektórzy użytkownicy (i jestem ich część) niech zaczepy uruchomione przez długi czas, jeśli użytkownicy są uprawnieni do usuwania danych, może się nie dzieje. Błąd 404 może być lepszym błędem w obsłudze błędu usuniętego zasobu niż wysłanie wiadomości e-mail do administratora.

Inni użytkownicy przejść do adresów z ich historii, (tak samo, jeśli dane zostały usunięte, ponieważ może to się dzieje).

+1

+1 na długich kartach. 404 przez stare zakładki dużo mi się przydarza. –

+0

Dziękuję Chris za sugestię. Naprawdę przeszkadza mi to, że gdy ręcznie przeszukuję bazę danych MySql (korzystając z informacji o błędach otrzymanych z serwera), trafiam poprawny wpis bez żadnego problemu. Ponadto ta sama akcja czasami rzuca wyjątek DoesNotExist, ale działa w większości innych czasów. To nie wygląda na problem z brakującym wpisem w bazie danych :( –

+0

Mogę mieć mniej użytkowników, ale z postgres nigdy nie miałem tego rodzaju problemów. Naprawdę nie mamy wielu informacji, twoja baza danych nie ma klastrowanie slave/master? Nie korzystasz z pamięci podręcznej dla zestawów zapytań? – christophe31

10

Można to wykorzystać:

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

Cóż, jeśli istnieje określony obiekt, który chcesz, to nie można użyć filtra, ponieważ może on zwrócić pustą listę Jeśli zapytanie nie pasuje. A kiedy to się zgadza, musisz użyć pierwszego obiektu z listy. – Jay

29

Może nie masz rekord uwag takiego klucza podstawowego, należy użyć tego kodu:

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

ten pomoże mi. dzięki – jned29

1

można spróbować w ten sposób. wystarczy użyć funkcji, aby uzyskać obiekt

def get_object(self, id): 
    try: 
     return Comment.objects.get(pk=id) 
    except Comment.DoesNotExist: 
     return False 
Powiązane problemy