2010-03-16 6 views
9

Mi modelo es el siguiente:Django 'consulta <object> coincidencia no existe' cuando puedo verlo en la base de datos

class Staff(models.Model): 
    StaffNumber = models.CharField(max_length=20,primary_key=True) 
    NameFirst = models.CharField(max_length=30,blank=True,null=True) 
    NameLast = models.CharField(max_length=30) 
    SchoolID = models.CharField(max_length=10,blank=True,null=True) 
    AutocompleteName = models.CharField(max_length=100, blank=True,null=True) 

estoy usando MySQL, en caso de que lo que importa.

Desde el manage.py shell:

[email protected]:/var/www/django-sites/apps# python manage.py shell 
Python 2.5.2 (r252:60911, Jan 20 2010, 21:48:48) 
[GCC 4.2.4 (Ubuntu 4.2.4-1ubuntu3)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
(InteractiveConsole) 
>>> from disciplineform.models import Staff 
>>> s = Staff.objects.all() 
>>> len(s) 
406 

así que sé que hay 406 objetos "personal" de allí. También puedo verlos en la base de datos. Verifico uno de los valores:

>>> s[0].NameFirst 
u'"ANDREA"' 

Eso también coincide con lo que veo en la base de datos. Ahora trato de 'obtener' este objeto.

>>> a = Staff.objects.get(NameFirst='ANDREA') 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/var/lib/python-support/python2.5/django/db/models/manager.py", line 93, in get 
    return self.get_query_set().get(*args, **kwargs) 
    File "/var/lib/python-support/python2.5/django/db/models/query.py", line 309, in get 
    % self.model._meta.object_name) 
DoesNotExist: Staff matching query does not exist. 

¿Huh? Esto está sucediendo para todos los valores de todas las columnas que he probado. Obtengo el mismo resultado en mi código view.py.

Obviamente estoy haciendo algo tonto. ¿Qué es?

Respuesta

9

Trate

a = Staff.objects.get(NameFirst=u'"ANDREA"') 

El u le dice a Python/Django es una cadena Unicode, no un viejo y simple str, y en su muestra s[0].NameFirst, se muestra el valor que contiene comillas dobles.

+1

¡Fueron las citas! Esa fue la tontería que estaba haciendo. Todos los valores en la base de datos estaban rodeados por comillas dobles. Ya no veo más citas, así que no me di cuenta. Para el registro, intenté incluir las comillas sin la especificación Unicode y aún así funcionó. Gracias! – ScottOrwig

+0

De nada.Realmente no pensé que era el problema de Unicode, ya que Django ha sido uniformemente increíble sobre el manejo de Unicode, pero no uso MySQL, así que quería asegurarme de que todas mis bases estaban cubiertas. –

+0

En mi caso, era una variable, así que usé Unicode (nombre_variable). –

0

Me he encontrado con problemas similares antes.

No estoy del todo seguro de por qué, pero el "obtener" en bruto tiende a darme problemas. Por lo tanto, generalmente termino usando 'filtro' y luego obtengo el primer resultado.

a = Staff.objects.filter(NameFirst='ANDREA') 
result = a[0] 
2

me encontré con el mismo problema, aquí está la solución:

from django.db import reset_queries, close_connection 
close_connection() 
reset_queries() 
2

Nombre se almacena en la base de datos con un comillas dobles redundantes adicionales. Por lo tanto, si se desea capturar ese registro, código correcto es:

a = Staff.objects.get(NameFirst='"ANDREA"') 

... en lugar de:

a = Staff.objects.get(NameFirst='ANDREA') 

Si no se puede estar seguro, que consulta devolverá resultado, debe añadir manejo de excepciones, algo así:

try: 
    a = Staff.objects.get(NameFirst='"ANDREA"') 
except Exception: 
    a = None 
-1

Me ha pasado algo similar. Pude resolverlo colocando algo en el DB para que volviera la consulta.

Esto no es exactamente como el tuyo, pero fue el primer golpe en Google, así que pensé en compartirlo.

+1

Tienes que explicar más. – Mistu4u

Cuestiones relacionadas