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?
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 ...
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!
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)
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.
Dans le champ approprié explicitement défini
primary_key = True
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'
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.
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).