2010-09-24 16 views
30

No tengo idea de por qué aparece este error. Estos son los modelos que creé -Modelos Django (1054, "Columna desconocida en 'lista de campos'")

from django.db import models 
from django.contrib.auth.models import User 

class Shows(models.Model): 
    showid= models.CharField(max_length=10, unique=True, db_index=True) 
    name = models.CharField(max_length=256, db_index=True) 
    aka = models.CharField(max_length=256, db_index=True) 
    score = models.FloatField() 

class UserShow(models.Model): 
    user = models.ForeignKey(User) 
    show = models.ForeignKey(Shows) 

Esta es la vista desde el cual puedo acceder a estos modelos -

from django.http import HttpResponse 
from django.template import Context 
from django.template.loader import get_template 
from django.http import HttpResponse, Http404 
from django.contrib.auth.models import User 

def user_page(request, username): 
    try: 
     user = User.objects.get(username=username) 
    except: 
     raise Http404('Requested user not found.') 

    shows  = user.usershow_set.all() 
    template = get_template('user_page.html') 
    variables = Context({ 
     'username': username, 
     'shows' : shows}) 
    output = template.render(variables) 
    return HttpResponse(output) 

En este punto me sale un error -

OperationalError: (1054, "Columna desconocida 'appname_usershow.show_id' en 'lista de campos'")

Como ve, esta columna ni siquiera está presente en mis modelos? ¿Por qué este error?

+0

Extraño. Por lo general, obtienes un error de validación del modelo si declaras 'id' como un campo en un modelo. Me refiero al primer campo del modelo 'Shows'. ¿Puedes verificar nuevamente? –

+0

que era un error tipográfico. debería haber sido 'showid'. Volviendo, el comando syncdb termina creando los modelos en el DB. Sin errores en esta etapa Solo cuando se invoca la vista, aparece este error ... –

+1

¿Se puede publicar el seguimiento de la pila del error? Me gustaría saber qué línea dentro de su vista lo está levantando. –

Respuesta

12

Como dijo mi @inception tablas esquema había cambiado & corriendo syncdb no actualizó las tablas ya creadas.

Aparentemente, cualquier cambio en los modelos cuando se actualiza a través de syncdb no cambia (como en la actualización/modificación) las tablas reales. Así que dejé caer el correspondiente DB & ejecuté syncdb en DB vacía. Ahora funciona bien. :)

Para otros, la herramienta de migración de datos SOUTH para Django parece ser la opción favorita. Parece proporcionar opciones que los modelos de django & syncdb quedan cortos. Debe verificar ...

+0

Gracias por el consejo sur. – piokuc

4

Normalmente aparece cuando intento acceder al campo que no existe en la Base de datos.

Compruebe si el campo existe en la base de datos. Si cambia el modelo y realiza syncdb, no actualizará la base de datos, no estoy seguro si ese es el caso.

En otra nota Django ofrece un atajo para reemplazar el bloque try/except en tu código usando get_object_or_404. (Disponible en django.shortcuts)

try: 
    user = User.objects.get(username=username) 
except: 
    raise Http404('Requested user not found.') 

se puede cambiar a:

user = get_object_or_404(User, username=username) 
+0

Esto es esencialmente lo que ocurre cuando se intenta utilizar los serializadores Django Rest Framework. Asegúrese de tener un serializador que subclasifique 'ModelSerializer', que migre cualquier cambio a los Modelos antes de escribir sus clases de serializador (o simplemente comente cualquier cosa relacionada con el serializador, migre, luego descomente). – keverly

25

tal vez el esquema de sus tablas ha sido cambiado? Además, ejecutar syncdb no actualiza las tablas ya creadas.

Puede que tenga que soltar todas las tablas & luego ejecutar syncdb nuevamente. Recuerde también hacer una copia de seguridad de sus datos.

+1

+1, Esto me ahorró un montón de tirones de pelo (después de pasar demasiado tiempo con el mismo problema) – Problematic

0

Creé un archivo de modelo para mi aplicación y luego hice varios sqlall mientras refinaba mis tablas. Uno de los cambios que hice fue establecer primary_key=True en uno de mis campos. Al final pidió syncdb. Se agregó un valor ficticio e intenté acceder a él con User.objects.all(), User siendo mi clase de modelo. Aunque funcionó bien, apareció este error al imprimir la lista devuelta por la llamada all(). Se lee DatabaseError: (1054, "Unknown column 'polls_user.id' in 'field list'")

Sorprendentemente, lo intenté y pude resolverlo con otra llamada al syncdb. Recuerdo que no había visto la columna de identificación en la tabla en ningún momento durante el ejercicio cuando lo revisé a través del cliente de línea de comandos de mysql.

3

He conocido a los mismos problemas:

En primer lugar, ejecute

manage.py sqlall [appname] 

y se pueden encontrar:

`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, 

y añadir el manual de la columna:

ALTER TABLE tb_realtime_data ADD id integer AUTO_INCREMENT NOT NULL PRIMARY KEY FIRST; 

y luego funcionó.

Creo que django agregará la columna llamada id.

For convenience, each model is given an autoincrementing primary key field named id unless you explicitly specify primary_key=True on a field (see the section titled “AutoField” in Appendix A).

Puede hacer clic en here para obtener más detalles.

Buena suerte.

+0

¿Puede por favor aclararme cómo agregó esa línea y dónde debe agregarse? –

+0

Lamento mucho haberte respondido hoy. Ok, esta es una buena pregunta. Lo usa cuando quiere usar django ORM para acceder a la base de datos creada por _handed_ not django. Quiero decir que has definido un modelo, usarás esta API cada vez que necesites acceder a la base de datos. Pero la base de datos no es creada por django ORM. Cuando esto, debe agregar una columna llamada 'id' a la ** tabla **. Puede conectarse a la base de datos usando sql directamente, creo. –

1

En el campo apropiado establecer explícitamente

primary_key = True 
+0

Sí, en mi caso, estoy teniendo una tabla que no tiene la clave principal que causa el error. – zinking

0

recibí este error al intentar utilizar serializadores Django Framework Rest. Asegúrese de tener un serializador que subclasifique ModelSerializer, que migre cualquier cambio a los Modelos antes de escribir sus clases de serializador (o simplemente comente cualquier cosa relacionada con el serializador, migre, luego descomente).

0

La solución directa es eliminar archivos en la carpeta ../Project/App/migrations, y el método para evitar este problema es crear una nueva columna de tabla databaes en lugar de chagne la existente.

Cuestiones relacionadas