Avec le nouveau framework de migration de Django, disons que j’ai le modèle suivant qui existe déjà dans la base de données:
class TestModel(models.Model):
field_1 = models.CharField(max_length=20)
Je veux maintenant ajouter un nouveau TextField au modèle, ainsi il ressemble à ceci:
class TestModel(models.Model):
field_1 = models.CharField(max_length=20)
field_2 = models.TextField(blank=True)
Lorsque j'essaie de migrer ce modèle à l'aide de python manage.py makemigrations
, Je reçois cette invite:
You are trying to add a non-nullable field "field_2" to testmodel without a default; we can"t do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows)
2) Quit, and let me add a default in models.py
Je peux facilement résoudre ce problème en ajoutant null=True
à field_2
, mais la convention de Django est de éviter en utilisant null sur des champs basés sur des chaînes tels que CharField et TextField (de https://docs.djangoproject.com/en/dev/ref/models/fields/). Est-ce un bug ou est-ce que je comprends mal la documentation?
Réponses:
15 pour la réponse № 1Ce n'est pas un bug, c'est documenté et logique. Vous ajoutez un nouveau champ, qui est (selon les meilleures pratiques, comme vous l'avez remarqué) non NULL
djouable doit donc y mettre quelque chose pour les enregistrements existants - je suppose que vous voulez que ce soit la chaîne vide.
vous pouvez
1) Provide a one-off default now (will be set on all existing rows)
alors appuyez simplement sur 1 et fournissez ""
(la chaîne vide) comme valeur.
ou préciser default=""
dans le models.py, comme suggéré:
2) Quit, and let me add a default in models.py