141 votes

Erreur Django - la requête correspondante n'existe pas

J'ai finalement lancé mon projet au niveau de la production et j'ai soudainement rencontré des problèmes que je n'avais jamais eu à traiter pendant la phase de développement.

Lorsque les utilisateurs publient certaines actions, je reçois parfois l'erreur suivante.

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

Ce qui me frustre vraiment, c'est que le projet fonctionne bien dans l'environnement local et que, de plus, l'objet de requête correspondant existe bien dans la base de données.

Maintenant, je soupçonne que l'utilisateur accède à la base de données alors qu'elle est réservée à d'autres utilisateurs, mais il n'y a aucun moyen de prouver mon argument et je n'ai aucune solution.

Quelqu'un a-t-il déjà eu ce genre de problème ? Avez-vous des suggestions sur la façon de résoudre ce problème ?

Je vous remercie d'avance pour votre aide.

EDIT : J'ai interrogé manuellement la base de données en utilisant les mêmes informations que celles récupérées dans le courriel d'erreur de serveur que j'ai reçu. J'ai pu atteindre l'entrée sans aucun problème. De plus, il semble que le même comportement que l'utilisateur a effectué ne pose pas de problème la plupart du temps, mais plutôt dans certains cas (qui sont encore inconnus). En conclusion, il ne s'agit certainement pas d'un problème d'entrée manquante dans la base de données.

154voto

Dracontis Points 3257

Si vous n'avez pas d'enregistrement de Commentaires avec une telle clé primaire, alors vous devez utiliser ce code :

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

136voto

christophe31 Points 1736

Votre ligne soulevant l'erreur est ici :

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

vous essayez d'accéder à un commentaire inexistant.

from django.shortcuts import get_object_or_404

comment = get_object_or_404(Comment, pk=comment_id)

Au lieu d'avoir une erreur sur votre serveur, votre utilisateur obtiendra un 404 signifiant qu'il tente d'accéder à une ressource inexistante.

Ok jusqu'ici je suppose que vous êtes au courant.

Certains utilisateurs (et j'en fais partie) laissent les onglets fonctionner pendant longtemps, si les utilisateurs sont autorisés à supprimer des données, cela peut arriver. Une erreur 404 peut être une meilleure erreur pour gérer une erreur de ressource supprimée que d'envoyer un email à l'administrateur.

Les autres utilisateurs vont aux adresses de leur historique, (même si les données ont été supprimées car cela peut arriver).

34voto

Klang Wutcharin Points 37

Vous pouvez utiliser ceci :

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

17voto

Mehedi Hasan Points 369

Vous pouvez essayer cette méthode. Utilisez simplement une fonction pour obtenir votre objet.

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

0voto

Akash Darji Points 21

Essayez celui-ci

comment, created = Comment.objects.get_or_create(pk=comment_id)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X