Partage
  • Partager sur Facebook
  • Partager sur Twitter

Django - IntegrityError

15 septembre 2019 à 19:13:27

Bonjour, j'apprends actuellement Django. J'en suis à la partie "Les liaisons entre modèles" du chapitre "Les modèles" :

https://openclassrooms.com/fr/courses/1871271-developpez-votre-site-web-avec-le-framework-django/1872229-les-modeles

Dans le fichier .\crepes_bretonnes\blog\models.py, je viens d'ajouter :

  • categorie = models.ForeignKey('Categorie', on_delete=models.CASCADE) dans la classe Article
  • la classe Categorie

Ensuite ,dans l'invite de commandes, pour mettre à jour ma base de données, j'ai fait :

  • python manage.py makemigrations

Là, le cours l'avait prévu, comme j'avais déjà des entrées présentes dans la table "Article", Django me demande que faire pour ces lignes déjà existantes.
Je choisis l'option "1" pour attribuer une catégorie par défaut pour les entrée déjà créées.
Ensuite j'entre encore "1" pour donner la première catégorie à ces entrées.

  • python manage.py migrate

Et là une erreur apparaît :

bad_value, referenced_table_name, referenced_column_name
django.db.utils.IntegrityError: The row in table 'blog_article' with primary key '1' has an invalid foreign key: blog_article.categorie_id contains a value '1' that does not have a corresponding value in blog_categorie.id.

Et çà c'était pas prévu :(...

Merci beaucoup si vous pouvez m'aider sur ce coup !

-
Edité par Xysmath87 15 septembre 2019 à 19:19:48

  • Partager sur Facebook
  • Partager sur Twitter
16 septembre 2019 à 23:37:49

Salut

Je n'ai jamais accroché à Django, mais, on dirait que la valeur 1 d'une clé étrangère n'existe pas.

En gros, imagine 2 tables : Album de Musique et genre.

Tu aurais :

TABLE GENRE :
id_genre : int
type_genre : str

1, Rap
2, Rock
3, Classique
TABLE ALBUM:
id_album : int
nom_album : str
#id_genre(GENRE.id_genre) : fk*

*Clé étrangère

1, Bliblibli, 2 (donc Rock)
2, Blablabla, 1 (donc Rap)
3, Blobloblo, 6 (??? pas de 6 dans GENRE) : IntegrityError ?




-
Edité par Le Cobriste 128 16 septembre 2019 à 23:38:28

  • Partager sur Facebook
  • Partager sur Twitter
18 septembre 2019 à 15:24:16


Ok merci, pourtant j'ai suivi exactement les étapes du cours...

Si je comprends bien, l'erreur viendrait du fait que j'essaie d'ajouter un champ ForeignKey('Categorie'...) dans la table "Article" qui contient déjà 2 entrées alors que ma table "Categorie" est pour l'instant vide...

J'ai regardé le PDF d'une ancienne version de ce cours et je pense avoir trouvé l'explication :

"Nous avons modifié notre classe Article et allons rencontrer un des rares défauts de Django. En effet, si nous lancions

maintenant  manage.py syncdb , il créerait bien la table correspondant au modèle Categorie, mais n'ajouterait pas le champ ForeignKey dans la table Article pour autant.

Pour résoudre ce problème, deux méthodes s'offrent à vous :

  • Vous créez manuellement le champ via l'interface SQLite et en langage SQL si vous en êtes capables, cette solutionconserve vos données, mais c'est la plus difficile à implémenter ;

  • Vous supprimez le fichier SQLite dans lequel la base de données est enregistrée (dans la partie précédente, nous avons indiqué database.sql comme nom de fichier) et utilisez ensuite la commande  manage.py syncdb . Les données dans vos tables seront perdues, mais les structures des tables seront à jour. Étant donné que nous n'avons pas de vraies données pour le moment, privilégiez cette solution."

Voilà je pense qu'il faudrait mettre ce passage dans le nouveau cours.

-
Edité par Xysmath87 18 septembre 2019 à 15:42:22

  • Partager sur Facebook
  • Partager sur Twitter
18 septembre 2019 à 15:37:17

En fait, les identifiants (clés primaires) ne commencent pas forcément par 1, ce sont des nombres uniques. Quand tu as écrit : "Ensuite j'entre encore "1" pour donner la première catégorie à ces entrées.", peut-être que le gestionnaire de BDD cherche la clé primaire de valeur 1 et qu'elles n'existent pas.
  • Partager sur Facebook
  • Partager sur Twitter
18 septembre 2019 à 18:15:57

Mais de toute façon tant que la table Categorie est vide, si la table Article contient des entrées, et qu'on ajoute une clé étrangère "catégorie" après l'ajout de ces entrées, il y aura forcément un problème non ?
  • Partager sur Facebook
  • Partager sur Twitter
18 septembre 2019 à 18:19:38

Non ça devrait passer...
  • Partager sur Facebook
  • Partager sur Twitter

Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

18 septembre 2019 à 18:39:41

Désolé, je suis débutant, voici comment je comprends :

Après l'ajout de la clé étrangère dans la table Article, Django me demande d'attribuer une catégorie par défaut pour les entrées déjà présentes dans cette table. Je mets 1 par exemple, sauf que comme la table Categorie est vide, il n'y a aucune catégorie qui correspond à l'id 1. Du coup il me renvoie une erreur...

-
Edité par Xysmath87 18 septembre 2019 à 18:39:57

  • Partager sur Facebook
  • Partager sur Twitter
18 septembre 2019 à 18:51:10

Il faut déjà créer tes catégories
  • Partager sur Facebook
  • Partager sur Twitter

Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

26 septembre 2019 à 22:28:50

J'ai eu la même erreur que toi Lou82, as-tu pu la résoudre? J'ai essayé ce que tu citais de l'ancien cours, mais syncdb n'existe plus et c'est remplacé par migrate. J'ai donc fait migrate, mais ça a essayé de faire toutes les migrations précédentes, ce qui a foiré, forcément. J'ai donc aussi effacé toutes les migrations dans le dossier idoine, et ça passe enfin!
  • Partager sur Facebook
  • Partager sur Twitter
30 septembre 2019 à 9:11:20

= le dossier qui va bien (genre blog/migrations)

  • Partager sur Facebook
  • Partager sur Twitter
2 octobre 2019 à 21:18:00

Ah ok merci pour ta réponse.
  • Partager sur Facebook
  • Partager sur Twitter
26 décembre 2019 à 4:42:26

Lou82 je suis planté , j'ai le meme probleme que toi . tu as pu le resoudre ?
  • Partager sur Facebook
  • Partager sur Twitter
28 décembre 2019 à 12:29:49

Essaie de tout effacer dans le dossier blog/migrations sauf le fichier __init__.py
  • Partager sur Facebook
  • Partager sur Twitter
2 février 2020 à 18:50:58

Hello à tous !

même problème également pour moi ... !

effectivement en gros, il ne faut pas écrire les exemples uniquement concernant la table Article mais passer directement à la classe avec les catégories et là c'est ok ...

-
Edité par CecileHenry 2 février 2020 à 21:36:19

  • Partager sur Facebook
  • Partager sur Twitter
26 avril 2020 à 17:37:12

Il faut supprimer le fichier db.sqlite3 et retaper les commandes ça marchera
  • Partager sur Facebook
  • Partager sur Twitter
5 janvier 2021 à 17:08:48

merci à vous

-
Edité par ChristianTatsambon 5 janvier 2021 à 17:09:24

  • Partager sur Facebook
  • Partager sur Twitter
5 janvier 2021 à 18:48:18

@ChristianTatsambon Bonsoir, merci de ne pas déterrer d'ancien sujet. Pour dire merci pas la peine de déterrer un sujet vous avez la possibilité de cliquer sur les pouces levés des messages qui vous ont aidés.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter