2013-07-23 21 views
28

Ho finalmente rilasciato il mio progetto a livello di produzione e improvvisamente ho alcuni problemi che non ho mai dovuto affrontare nella fase di sviluppo.Errore Django - la query di corrispondenza non esiste

Quando gli utenti pubblicano alcune azioni, a volte ho il seguente errore.

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 

Ciò che veramente mi frustra è che il progetto funziona bene nell'ambiente locale e, inoltre, l'oggetto di query corrispondente esiste nel database.

Ora sospetto che l'utente stia accedendo al Database quando è riservato ad altri utenti, ma non c'è modo di dimostrare la mia argomentazione né ho alcuna soluzione.

Qualcuno ha avuto questo tipo di problema prima? Qualche suggerimento su come risolvere questo problema?

Grazie mille per il vostro aiuto in anticipo.

MODIFICA: Ho interrogato manualmente il database utilizzando le stesse informazioni recuperate dall'email di errore del server che ho ricevuto. Sono stato in grado di colpire la voce senza alcun problema. Inoltre, sembra che lo stesso comportamento che l'utente ha eseguito non sollevi alcun problema la maggior parte del tempo, ma piuttosto in alcuni casi (che è ancora sconosciuto). In conclusione, sicuramente non è un problema con la voce mancante nel database.

+1

Chiaramente, si tratta di un problema di dati: 'comment = Comment.objects.get (pk = COMMENT_ID)' Verificare l'ID esiste nel database – karthikr

+1

"manage.py sqlall pitone "genererà l'SQL corrispondente ai tuoi modelli. Controlla se corrisponde allo schema SQL del DB. Ad esempio, se si lavora con PostgreSQL, può anche essere un problema di sequenza. In conclusione: puoi portare più informazioni sul tuo ambiente (SQDB, DB, tabella corrispondente in DB e codice in models.py, ...)? – Ricola3D

+0

@ Ricola3D Ciao Ricola, attualmente sto usando MySql DB che lo ospita dall'istanza di Amazon EC2. E sto usando il commento di Django costruito per il momento. Nel frattempo, proverò a eseguire il comando sqlall che hai suggerito. Grazie. –

risposta

40

vostra linea sollevando l'errore è qui:

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

si tenta di accedere un commento inesistente.

from django.shortcuts import get_object_or_404 

comment = get_object_or_404(Comment, pk=comment_id) 

Invece di avere un errore sul server, l'utente otterrà un 404 che significa che egli cerca di accedere a una risorsa non esistente.

Ok fino a qui Suppongo che tu ne sia a conoscenza.

Alcuni utenti (e io ne faccio parte) lasciano funzionare le schede per un lungo periodo di tempo, se gli utenti sono autorizzati a cancellare i dati, potrebbe accadere. Un errore 404 potrebbe essere un errore migliore per gestire un errore di risorsa eliminata rispetto all'invio di un'email all'amministratore.

Altri utenti visitano gli indirizzi dalla loro cronologia, (lo stesso se i dati sono stati cancellati poiché potrebbe accadere).

+1

+1 su schede con esecuzione prolungata. 404 tramite vecchie schede mi succede molto. –

+0

Grazie Chris per il tuo suggerimento. Quello che mi infastidisce di più è che quando interrogo manualmente il database MySql (usando le informazioni di errore che ho ricevuto dal server), ho inserito la voce corretta senza alcun problema. Inoltre, la stessa azione a volte genera eccezione a DoesNotExist ma funziona la maggior parte delle altre volte. Non sembra che il problema con la voce mancante nel database :( –

+0

Potrei avere meno utenti, ma con postgres non ho mai avuto questo tipo di problemi.Non abbiamo davvero molte informazioni, il tuo database non ha clustering slave/master? Non si usa la cache su querysets? – christophe31

10

È possibile utilizzare questo:

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

Bene, se esiste un oggetto specifico che si desidera, non è possibile utilizzare il filtro poiché potrebbe restituire un elenco vuoto se la query non corrisponde. E quando corrisponde, devi usare il primo oggetto dalla lista. – Jay

29

Forse non avete osservazioni record con tale chiave primaria, quindi si dovrebbe utilizzare questo codice:

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

questo mi aiuta. Grazie – jned29

1

Si può provare in questo modo. basta usare una funzione per ottenere il vostro oggetto

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