Django : django.db.utils.IntegrityError: table__new.colonne may not be NULL
C’est le genre de problème qui arrive très souvent lorsqu’on touche à une base de données, en ajoutant un champ.
Pourquoi ? Parce que par défaut, les champs crées sans paramètres ne doivent pas être vides.
Exemple concret : je veux rajouter pour un modèle, un champ « exemple » :
class Groupe(models.Model):
description = models.CharField(max_length=150)
exemple = models.CharField()
Je fais « makemigration / migrate
» et là, horreur : « django.db.utils.IntegrityError: main_groupe__new.exemple may not be NULL
»
La solution
- Supprimer le dossier « migrations » de l’application concernée
- Lancer un
migrate --fake-initial
qui va « simuler » un migrate, sans essayer de créer les tables - Lancer
makemigration nomappli
(!! c’est ici que si on oublie le nom de l’appli rien ne se passe !!) - Seconde astuce : supprimer le champ fautif
- Lancer
migrate
: là il va supprimer de la base le champ fautif - Remettre le champ avec
blank=True, default=None
- Refaire
makemigration
puismigrate
sans préciser le nom de l’appli, comme d’habitude.
Et votre nouveau code sera pris en compte :
class Groupe(models.Model):
description = models.CharField(max_length=150)
exemple = models.CharField(max_length=150,
blank=True, default=None)
Oui je sais ça a l’air long, mais en pratique ça prend deux-trois minutes seulement !