8
votes

Django: colonne BasewareError n'existe pas

J'ai un problème avec Django 1.2.4.

Voici un modèle: xxx

juste après avoir rincé la base de données, j'utilise le shell: xxx

quoi Est-ce que je fais mal ici?

Mise à jour : Si je commencez le Foundanykey , le problème disparaît.

Mise à jour 2 : curieusement, ce test d'unité fonctionne simplement bien: xxx

Pourquoi fonctionne-t-il ici mais pas dans la coquille?

< Strong> Mise à jour 3 : La raison pour laquelle il fonctionne dans des tests unitaires, mais pas la coque peut avoir quelque chose à voir avec les différentes bases de données utilisées:

Paramètres.py : xxx

update 4 : confirmé que lorsque j'utilise SQLite3 comme dB, tout fonctionne bien.


4 commentaires

Pour être clair, vous avez exécuté syncdb sur une base de données vide ou édité à la main le schéma? Il semble que vous soyez conscient qu'un modèle modifié ne mettra pas automatiquement à jour la table ... mais en vous assurant que


Je veux juste être sûr que ce n'est pas sûr que ce n'est pas un problème de base de données existant: avez-vous laissé tomber votre base de données Postgres et la réo-créée? J'ai certainement vu des problèmes persistants lorsque les gens essaient affleurant ou partiels synchyses. La raison pour laquelle je demande est que cela soutiendrait une puanteur si un simple modèle de champ de 2 champs n'a pas créé de colonnes correctement sur PostgreSQL_PSYCOPG2. Avez-vous également vérifié si foo_foo.bar_id existe dans dbshell ? Plus le Merrier!


"Colonne foo foo.bar _id n'existe pas" - y a-t-il une table "foo foo" avec une colonne "bar_id"?


Une alternative à la réinitialisation de la DB (comme Bjorn pointe correctement) est d'utiliser Sud pour les migrations - South. Aeracode.org/docs/installation.html . Il est extrêmement simple à utiliser et si vous avez besoin d'un guide étape par étape, c'est un bon post à lire: Mitchfournier.com/2010/06/23/...


5 Réponses :


9
votes

Essayez de supprimer / essuyer complètement la base de données avant d'exécuter Syncdb.

Je me souviens avoir besoin de le faire un moment où j'avais apporté des modifications aux champs de clés étrangers.


2 commentaires

Il est spécifié dans Django Documentation que Syncdb ne modifiera pas les tableaux existants. Donc, si vous avez créé les tables avec Syncdb, puis modifiez des champs en modifiant le modèle, vous devez tout supprimer: ./ manage.py réinitialiser myApp ferait le tour. Cela fonctionne évidemment pour unitest, car les tables sont recréées à chaque cycle.


Si vous ne souhaitez pas réinitialiser votre DB après chaque changement de modèle, essayez sud .



0
votes

J'ai fait face au même problème et remarqua que dans la base de données du backend, le champ qui abrite des clés étrangères n'existait pas. Le problème a disparu après avoir créé le champ (que je pense est particulièrement particulier). Django ne semble pas créer de champ étiqueté comme clé étrangère. Une raison pour laquelle?


0 commentaires

3
votes

J'ai corrigé ce problème en laissant tomber le tableau spécifique à ce modèle de question. Ensuite utilisé:

su postgres #change user to postgres
psql <datebase> #access shell for <datebase> database
\d #list all tables
DROP TABLE "" CASCADE #select a table to drop
\q #exit shell


0 commentaires

3
votes

Si vous utilisez Django 1.8, vous devez créer la colonne. Pour vous assurer de créer la colonne, trouvez correctement le fichier de migration dans lequel vous avez créé le champ et exécutez:

./manage.py sqlmigrate app_name migration_name_sans_extension


4 commentaires

Pouvez-vous dire quelle est la colonne? Par exemple, j'ai deux colonnes à fourrure: référé_by et prise en charge_by qui font tous deux référence aux utilisateurs. J'ajouterais alors deux autres colonnes: user_referred_by et user_supported_by et ils référencent l'utilisateur (ID) ?? Pouvez-vous dire où dans les 1.8 docs ceci est couvert?


Par exemple, je reçois toujours django.db.utils.ProgrammingError: l'utilisateur de la colonne.referred_by_id n'existe pas.


Les colonnes feront référence par ID si vous spécifiez un champ to_field. Je ne suis pas sûr que cela soit couvert dans les documents, mais les informations sur les champs FK sont ici: docs.djangoproject.com/fr/1.8/ref/models/fields/#fferignkey


Cela devrait être la réponse acceptée, car elle s'applique aux versions modernes de Django et toutes les autres réponses sont vraiment inutiles pour travailler avec des tables de base de données que vous ne pouvez vraiment pas vous permettre de tomber.



5
votes

Veuillez lire ceci avant de déposer tout votre DB

J'ai eu le même problème. Veuillez lire l'exception complètement. J'ai eu une classe Modelform qui a lu ma table pour construire un formulaire et une exception était là. J'ai commenté puis dirigé les makemigrations et fonctionne complètement. Après cela, j'ai commenté la classe Modelform et tout fonctionne parfaitement.

J'espère que cela aide.


0 commentaires