Django error de coincidencia de la consulta no existe

Finalmente me liberó mi proyecto para el nivel de producción y de repente tengo algunos problemas nunca he tenido que lidiar con en la fase de desarrollo.

Cuando los usuarios de los puestos de algunos de acciones, a veces me sale el siguiente error.

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

Lo que realmente me frustra es que el proyecto funciona correctamente en el entorno local y, además, la coincidencia de objeto de consulta NO existe en la Base de datos.

Ahora estoy sospechando de que el usuario tenga acceso a la Base de datos cuando se reservados a otros usuarios, pero no hay manera de demostrar mi argumento ni tengo una solución para ti.

¿Alguien ha tenido este tipo de problema antes? Cualquier sugerencia sobre cómo resolver este problema?

Muchas gracias por su ayuda de antemano.

EDIT: he manualmente consultar la base de datos con la información recuperada de error del servidor de correo electrónico que he recibido. Yo era capaz de golpear la entrada sin ningún problema. Además, parece exactamente el mismo comportamiento que el usuario lleva a cabo no plantea ningún problema la mayoría de las veces, sino que en algunos de ellos (lo cual es aún desconocido) de los casos. En conclusión, definitivamente no es un problema con la falta de entrada en la base de datos.

  • Claramente, no es un problema: comment = Comment.objects.get(pk=comment_id) verificar el id existe en la base de datos
  • «python manage.py sqlall» va a generar el SQL correspondiente a los modelos. Comprobar si se corresponde con el esquema DB de SQL. Si se está trabajando con PostgreSQL por ejemplo, también puede ser un problema de secuencia. En conclusión: puede aportar más información acerca de su entorno (SQDB, DB, de la tabla correspondiente en la base de datos y el código models.py, …) ?
  • Hola Ricola, actualmente estoy usando de base de datos MySql hosting de instancia de Amazon EC2. Y estoy utilizando el construido en Django Comentario por el momento. Mientras tanto, voy a tratar de ejecutar el sqlall comando que usted sugirió. Gracias.
InformationsquelleAutor Chris P | 2013-07-23

4 Kommentare

  1. 62

    su línea de elevar el error está aquí:

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

    intenta acceder a un no-existente comentario.

    from django.shortcuts import get_object_or_404
    
    comment = get_object_or_404(Comment, pk=comment_id)

    Lugar de tener un error en el servidor, el usuario recibirá un mensaje de error 404 significa que él intenta tener acceso a un sin recursos existentes.

    Ok hasta aquí supongo que son conscientes de ello.

    Algunos usuarios (y yo soy parte de ellos) vamos a fichas de correr por mucho tiempo, si los usuarios están autorizados a borrar datos, es posible que suceda. Un error 404 puede ser una mejor error de manejar un borrado de los recursos de error de enviar un correo electrónico a admin.

    Otros usuarios a ir a las direcciones de su historia, (lo mismo si los datos han sido eliminados, ya que puede suceder).

    • +1 en ejecución largas pestañas. 404 a través de viejas fichas que a mí me pasa mucho.
    • Gracias Chris por tu sugerencia. Lo que realmente me molesta es que cuando hago una consulta a la base de datos MySql manualmente (usando el error de la información recibida desde el servidor) yo le pego a la entrada correcta sin ningún problema. También, la misma acción a veces tirar DoesNotExist excepción pero funciona en la mayoría de las otras veces. No parece que el problema con la falta de entrada en la base de datos 🙁
    • Yo podría tener menos usuarios, pero con postgres nunca he tenido este tipo de problemas. Realmente no tenemos mucha información, la base de datos no tiene esclavo/maestro de la agrupación? No uso de caché en querysets?
    • Así que todavía no he realmente implementado ningún tipo de DB optimización del rendimiento ni de la espalda hasta la aplicación de métodos tales como esclavo/maestro de la agrupación o el almacenamiento en caché en querysets. Supongo que me voy a poner en práctica esas características y ver si el problema persiste.
    • Yo thaught acerca de él como posible fuente de problemas y no como posibles soluciones de problemas ^^. Como no se puede reproducir el error, me gustaría sugerir un estúpido solución. trate de detectar el error, vuelva a entrar en la captura después de dormir un segundo y registro.
    • También puede agregar esta en la captura: from django.db import connection, connection.connection.close(), connection.connection = None para tratar de restablecer la conexión db y el inicio de uno nuevo.

  2. 76

    Tal vez usted no tiene registro de Comentarios con tal de clave principal, entonces usted debe utilizar este código:

    try:
        comment = Comment.objects.get(pk=comment_id)
    except Comment.DoesNotExist:
        comment = None
    • Después de dos días de este solucionado mi problema.
  3. 16

    Usted puede utilizar esta:

    comment = Comment.objects.filter(pk=comment_id)
    • Bueno, Si no es objeto específico que usted desea, entonces usted no puede utilizar el filtro como Se puede devolver una lista vacía Si la consulta no coincidan. Y cuando igualó entonces tienes que usar el primer objeto de la lista.
    • Presumiblemente, ese es el punto: el uso de filtro y comprobar si el resultado es cero o más entradas, en lugar de generar una excepción?
    • Vale la pena destacar que Model.objects.filter devolverá un Queryset, mientras que Model.objects.get devolverá un objeto. Si el objeto no existe, el ex devolverá un vacío queryset, el último, el resultado será una Model.DoesNotExist de error.
  4. 7

    Usted puede tratar de esta manera. sólo tiene que utilizar una función para conseguir su objeto

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

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea