2010-09-24 9 views
30

Non ho idea del perché questo errore si verifichi. Qui ci sono i modelli che ho creato -Modelli Django (1054, "Colonna sconosciuta in 'elenco campi'")

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) 

Ecco la vista da cui accedere a questi modelli -

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) 

A questo punto ho un errore -

OperationalError: (1054, "Colonna sconosciuta" appname_usershow.show_id "in" elenco campi "")

Come vedi questa colonna non è nemmeno presente nei miei modelli? Perché questo errore?

+0

Strano. Di solito ottieni un errore di validazione del modello se dichiari 'id' come un campo in un modello. Mi riferisco al primo campo del modello 'Shows'. Puoi controllare di nuovo? –

+0

che era un errore di battitura. avrebbe dovuto essere "showid". Tornando indietro, il comando syncdb finisce per creare i modelli nel DB. Nessun errore in questa fase. Solo quando viene richiamata la vista, viene visualizzato questo errore ... –

+1

Puoi pubblicare la traccia dello stack dell'errore? Mi piacerebbe sapere quale linea all'interno della tua vista la sta sollevando. –

risposta

12

Come @inception ha detto il mio schema tavoli era cambiato & esecuzione syncdb non ha aggiornato le tabelle già create.

Apparentemente qualsiasi modifica ai modelli quando viene aggiornata tramite syncdb non modifica (come in aggiornamento/modifica) le tabelle effettive. Così ho lasciato cadere il relativo DB & syncdb sul DB vuoto. Ora funziona bene. :)

Per gli altri, lo strumento di migrazione dei dati per Django SOUTH sembra essere l'opzione preferita. Sembra fornire opzioni che i modelli django & syncdb non sono all'altezza. Deve controllare ...

+0

Grazie per il suggerimento sud. – piokuc

4

Normalmente ottengo questo quando sto provando ad accedere al campo che non esiste nel Database.

Verificare se il campo esiste nel database. Se cambi modello ed esegui syncdb non aggiornerà il database, non sono sicuro che sia così.

In un'altra nota Django offre una scorciatoia per sostituire try/except block nel codice usando get_object_or_404. (Disponibile in django.shortcuts)

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

può essere cambiato in:

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

Questo è essenzialmente ciò che accade quando si tenta di utilizzare i serializzatori di Django Rest Framework. Assicurati di disporre di un serializzatore che sottoclassi 'ModelSerializer', che migri qualsiasi modifica ai Modelli prima di scrivere le tue classi di serializzazione (o semplicemente commenta qualsiasi cosa relativa al serializzatore, esegui la migrazione, quindi fai il uncomment). – keverly

25

forse lo schema delle tabelle è stato modificato? Inoltre, l'esecuzione di syncdb non aggiorna le tabelle già create.

Potrebbe essere necessario eliminare tutti i tavoli & quindi eseguire nuovamente syncdb. Ricorda anche di fare il backup dei tuoi dati !!

+1

+1, Questo mi ha risparmiato un sacco di strappi (dopo aver passato troppo tempo con lo stesso problema) – Problematic

0

Ho creato un file di modello per la mia app e poi ho eseguito diversi sqlall mentre ho rifinito i miei tavoli. Uno dei cambiamenti che ho fatto è stato impostare primary_key=True in uno dei miei campi. Alla fine chiamata per syncdb. Aggiunto un valore fittizio e cercato di accedervi con User.objects.all(), User come classe del mio modello. Anche se questo ha funzionato bene, questo errore si è verificato durante la stampa della lista restituita dalla chiamata all(). Legge DatabaseError: (1054, "Unknown column 'polls_user.id' in 'field list'")

Sorprendentemente, ho provato e ho potuto risolverlo con un'altra chiamata a syncdb. Ricordo di non aver visto la colonna id nella tabella in qualsiasi momento durante l'esercizio quando l'ho controllato tramite il client della riga di comando mysql.

3

ho incontrato gli stessi problemi:

In primo luogo, eseguire

manage.py sqlall [appname] 

e si possono trovare:

`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, 

e aggiungere il manuale della colonna:

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

e poi ha funzionato.

Penso che Django aggiungerà la colonna denominata id stesso.

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).

è possibile fare clic here per i dettagli.

Buona fortuna.

+0

Puoi per favore chiarirmi come hai aggiunto quella linea e dove deve essere aggiunta? –

+0

Mi dispiace molto che ti risponda oggi. Ok, questa è una buona domanda. Lo usi quando vuoi usare django ORM per accedere al database che è stato creato da _handed_ not django. Voglio dire che hai definito un modello, userai questa API ogni volta che avrai bisogno di accedere al database. Ma il database non è stato creato da django ORM. Quando questo, dovresti aggiungere una colonna chiamata 'id' nella ** tabella **. Puoi collegarti al database usando sql direttamente, penso. –

1

nel campo appropriato impostata in modo esplicito

primary_key = True 
+0

sì, per il mio caso, sto avendo una tabella che non ha la chiave primaria che causa l'errore. – zinking

0

Ho ricevuto questo errore durante il tentativo di utilizzare serializzatori Django Resto Framework. Assicurati di disporre di un serializzatore che suddivide le sottoclassi ModelSerializer, di migrare eventuali modifiche ai Modelli prima di scrivere le classi del serializzatore (o semplicemente commentare qualsiasi cosa relativa al serializzatore, eseguire la migrazione, quindi rimuovere il commento).

0

La soluzione diretta è eliminare i file nella cartella ../Project/App/migrations e il metodo per evitare questo problema è creare una nuova colonna della tabella databas invece di quella esistente.

Problemi correlati