2017-09-05 1 views
1

Dans Django J'utilise manage.py makemigrations et manage.py migrate sur le fichier models.py suivant:Django: champ non annulable sans défaut

class Family(models.Model): 
    comment1 = models.CharField(max_length=80) 
    #comment2 = models.CharField(max_length=80) 

Après cette initialisation réussie, j'ai changé models.py à (je viens décommenter le nouveau champ de modèle qui est essentiellement une copie de l'autre champ modèle):

class Family(models.Model): 
    comment1 = models.CharField(max_length=80) 
    comment2 = models.CharField(max_length=80) 

maintenant, lorsque je tente de makemigrations encore, je reçois le texte suivant erreur:

Vous essayez d'ajouter un « commentaire » champ non annulable à la famille sans un défaut; nous ne pouvons pas faire cela (la base de données a besoin de quelque chose pour remplir lignes existantes).

S'il vous plaît choisir une solution:

1) Fournir un défaut unique maintenant (sera mis sur toutes les lignes existantes avec une valeur NULL pour cette colonne)

2) Quitter, et laissez-moi ajouter une valeur par défaut dans models.py Sélectionnez une option:

Pourquoi n'ai-je pas obtenu cette erreur lors de l'initialisation?

+1

Parce que vous étiez en train de créer la table à partir de zéro. Maintenant, comme l'erreur l'indique explicitement, la base de données a besoin de quelque chose pour remplir les lignes existantes. –

+0

mais il n'y a aucune ligne existante. juste comme quand j'ai initialisé! – user3182532

+0

ok je pense que je l'ai eu. bien qu'il n'y ait pas de lignes existantes, en principe il pourrait y avoir. Django ne sait pas comment enregistrer "comment2" des lignes existantes car il ne peut pas les enregistrer comme nulles et il n'a pas de valeur pour celles-ci.Lors de la première migration, Django a su: Je suis en train de créer une table, donc pas de données précédentes, donc null = Faux + aucune valeur par défaut n'est correcte. L'utilisateur ne pourra sauvegarder que des objets avec une valeur pour "comment1" mais c'est son problème. – user3182532

Répondre

0

Vous devez fournir défaut ou permettre vide à l'aide blanc, coz il y a des données précédentes qui n'a pas comment2.

comment2 = models.CharField(max_length=80,null=True,default='hi') 

Ou

comment2 = models.CharField(max_length=80,null=True,blank=True) 
+0

Il n'y a pas de données précédentes, la base de données est vide! – user3182532

+0

Mais vous avez d'abord fait une migration et l'avez migrée en utilisant comment1 seulement et plus tard vous faites de nouveau avec comment1 et comment2 cela peut être la raison. –

+0

Mais de toute façon c'est une bonne pratique de fournir des valeurs par défaut. –

0

Si vous voulez faire non annulable sans défaut. vous devez fournir une valeur pour le même champ lorsque vous créez un fichier de migration. C'est pourquoi il demande l'option. Tapez "1" dans le terminal tandis que python manage.py makemigrations, puis fournissez une valeur pour le champ pour la ligne précédemment enregistrée (le cas échéant). Faites-moi savoir si cela aide.

0

D'autres ont raison. vous devez définir une valeur par défaut pour ce champ. mais il y a un truc que vous pouvez résoudre. mais ce n'est pas un bon moyen ... seulement si vous n'avez pas le choix.
1. commentaire toutes votre table
2. Exécutez makemigrations et migrate
3. Annulez votre table
4.2. exécutez makemigrations et migrate à nouveau