web-dev-qa-db-fra.com

Modèles Django (1054, "Colonne inconnue dans la" liste de champs "")

Aucune idée pourquoi cette erreur surgit. Voici les modèles que j'ai créés -

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)

Voici la vue à partir de laquelle j'accède à ces modèles - 

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)

À ce stade, je reçois une erreur - 

OperationalError: (1054, "Colonne inconnue 'appname_usershow.show_id' dans 'liste de champs'")

Comme vous voyez cette colonne n'est même pas présente dans mes modèles? Pourquoi cette erreur?

32
Srikar Appalaraju

Comme @inception a déclaré que le schéma de mes tables avait changé et que l'exécution de syncdb ne mettait pas à jour les tables déjà créées.

Apparemment, toute modification apportée aux modèles lors de la mise à jour via syncdb ne modifie pas (comme dans la mise à jour/la modification) les tables réelles. J'ai donc abandonné la base de données pertinente et lancé syncdb sur une base de données vide. Maintenant cela fonctionne bien. :) 

Pour d'autres, SOUTH , l'outil de migration de données pour Django semble être l'option favorite. Il semble offrir des options que les modèles Django & syncdb ne permettent pas. Doit vérifier ...

13
Srikar Appalaraju

peut-être que votre schéma de tables a été changé? De plus, l'exécution de syncdb ne met pas à jour les tables déjà créées.

Vous devrez peut-être supprimer toutes les tables et ensuite réexécuter syncdb. Rappelez-vous également de prendre une sauvegarde de vos données!

27
Inception

Normalement, je comprends cela quand j'essaie d'accéder à un champ qui n'existe pas dans la base de données.

Vérifiez si le champ existe dans la base de données. Si vous modifiez le modèle et exécutez syncdb, il ne mettra pas à jour la base de données, je ne suis pas sûr que ce soit le cas. 

Par ailleurs, Django propose un raccourci pour remplacer try/except dans votre code en utilisant get_object_or_404. (disponible dans Django.shortcuts)

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

peut être changé en:

user = get_object_or_404(User, username=username)
5
Srikanth Chundi

J'ai rencontré les mêmes problèmes:

Première exécution 

manage.py sqlall [appname]

et vous pouvez trouver:

`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,

et j'ajoute le manuel de colonne:

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

et puis cela a fonctionné.

Je pense que Django va ajouter la colonne appelée id elle-même.

Par souci de commodité, chaque modèle reçoit un champ de clé primaire auto-incrémenté nommé id, sauf si vous spécifiez explicitement primary_key = True sur un champ (voir la section intitulée «Champ automatique» de l'annexe A).

vous pouvez cliquer sur ici pour plus de détails.

Bonne chance.

3
Ni Xiaoni

Dans le champ approprié explicitement défini

primary_key = True
2
RdB

C'est une question assez ancienne, mais vous trouverez peut-être quand même utile que ce qui suit soit utile: Vérifiez la base de données, il vous manque probablement show_id dans la table appname_usershow.

Cela peut se produire lorsque vous modifiez ou ajoutez un champ mais que vous oubliez d'exécuter la migration.

OR

Lorsque vous accédez à une table non gérée et que vous essayez d'ajouter une ForeignKey à votre modèle, suivez l'exemple ci-dessus:

class UserShow(models.Model):
    # some attributes ...
    show = models.ForeignKey(Show, models.DO_NOTHING)

    class Meta:
        managed = False
        db_table = 'appname_departments'
1
slajma

J'ai créé un fichier de modèle pour mon application, puis plusieurs sqlall et affiné mes tableaux. L'un des changements que j'ai apportés a été de définir primary_key=True sur l'un de mes champs. À la fin, appelé syncdb. Ajout d'une valeur factice et tentative d'y accéder avec User.objects.all(), User étant ma classe de modèle. Bien que cela ait fonctionné correctement, cette erreur s'est produite lors de l'impression de la liste renvoyée par l'appel all(). Il a lu DatabaseError: (1054, "Unknown column 'polls_user.id' in 'field list'")

Étonnamment, j'ai essayé et pouvais le résoudre avec un autre appel à syncdb. Je me souviens de n'avoir vu la colonne id dans la table à aucun moment de l'exercice lorsque je l'ai vérifiée via le client en ligne de commande mysql.

0
pravish

J'ai reçu cette erreur en essayant d'utiliser les sérialiseurs Django Rest Framework. Assurez-vous que si vous avez un sérialiseur qui sous-classe ModelSerializer, vous migrez toutes les modifications apportées aux modèles avant d'écrire vos classes de sérialiseur (ou commentez simplement tout ce qui concerne le sérialiseur, migrez, puis supprimez la mise en commentaire). 

0
keverly