Je sais qu'à partir de Django 1.7, je n'ai pas besoin d'utiliser South ou tout autre système de migration, donc j'utilise juste une commande simple python manage.py makemigrations
Cependant, tout ce que j'obtiens, c'est cette erreur:
You are trying to add a non-nullable field 'new_field' to userprofile without a default;
we can't do that (the database needs something to populate existing rows).
Voici models.py:
class UserProfile(models.Model):
user = models.OneToOneField(User)
website = models.URLField(blank=True)
new_field = models.CharField(max_length=140)
Quelles sont les options?
Réponses:
Vous devez fournir une valeur par défaut:
la source
default = website
ne fait pas le travailnew_field
surwebsite
.Si vous êtes au début du cycle de développement et que vous ne vous souciez pas des données de votre base de données actuelles , vous pouvez simplement les supprimer, puis migrer. Mais vous devez d'abord nettoyer le répertoire des migrations et supprimer ses lignes de la table (django_migrations)
la source
mysql -u[user] [database] -e "delete from django_migrations where app=[your_app]"
__init__.py
des migrations, ou de le restaurer après, sinon les migrations ne fonctionneront pas stackoverflow.com/a/46362750/1649917python manage.py sqlmigrate name_of_your_app nb_of_the_migration
est également requisUne option consiste à déclarer une valeur par défaut pour 'new_field':
une autre option est de déclarer 'new_field' comme un champ Nullable:
Si vous décidez d'accepter 'new_field' comme champ Nullable, vous voudrez peut-être accepter 'no input' comme entrée valide pour 'new_field'. Ensuite, vous devez également ajouter la
blank=True
déclaration:Même avec
null=True
et / ou,blank=True
vous pouvez ajouter une valeur par défaut si nécessaire:la source
Si vous êtes au début du cycle de développement, vous pouvez essayer ceci -
Supprimez / commentez ce modèle et toutes ses utilisations. Appliquez les migrations. Cela supprimerait ce modèle, puis ajouterait à nouveau le modèle, exécuterait des migrations et vous auriez un modèle propre avec le nouveau champ ajouté.
la source
Au cas où quelqu'un définirait a
ForeignKey
, vous pouvez simplement autoriser les champs Nullable sans définir de valeur par défaut:Si vous avez déjà des données stockées dans la base de données, vous pouvez également définir une valeur par défaut:
la source
Si «site Web» peut être vide, il
new_field
devrait également être défini comme vide.Maintenant, si vous voulez ajouter une logique lors de l'enregistrement où si
new_field
est vide pour récupérer la valeur de "site Web", tout ce que vous avez à faire est de remplacer la fonction de sauvegarde pour votreModel
comme ceci:la source
Vous ne pouvez pas ajouter de référence à une table contenant déjà des données.
Changement:
à:
faire:
changer à nouveau:
refaire la migration:
la source
Dans new_file, ajoutez la propriété booléenne null.
après avoir exécuté un
./manage.py syncdb
pour actualiser la base de données. et enfin tu cours./manage.py makemigrations
et./manage.py migrate
la source
Vous pouvez utiliser la méthode de Django Doc à partir de cette page https://docs.djangoproject.com/en/1.8/ref/models/fields/#default
Créer une valeur par défaut et l'utiliser
la source
Avez-vous déjà des entrées de base de données dans le tableau
UserProfile
? Si tel est le cas, lorsque vous ajoutez de nouvelles colonnes, la base de données ne sait pas sur quoi la définir car elle ne peut pas l'êtreNULL
. Par conséquent, il vous demande sur quoi vous souhaitez définir ces champs dans la colonnenew_fields
. J'ai dû supprimer toutes les lignes de ce tableau pour résoudre le problème.(Je sais que cela a été répondu il y a quelque temps, mais je viens de rencontrer ce problème et c'était ma solution. J'espère que cela aidera toute personne nouvelle qui verra cela)
la source
Je trouve honnêtement que le meilleur moyen de contourner ce problème était de simplement créer un autre modèle avec tous les champs dont vous avez besoin et dont le nom est légèrement différent. Exécutez des migrations. Supprimez le modèle inutilisé et réexécutez les migrations. Voila.
la source
Si vous ne parvenez pas à tronquer la table du modèle en question, vous pouvez spécifier une valeur par défaut unique de
None
dans l'invite. La migration sera superfluedefault=None
alors que votre code n'a pas de valeur par défaut. Il peut être appliqué très bien car il n'y a plus de données dans le tableau qui nécessiteraient une valeur par défaut.la source
J'étais au début de mon cycle de développement, donc cela peut ne pas fonctionner pour tout le monde (mais je ne vois pas pourquoi cela ne fonctionnerait pas).
J'ai ajouté
blank=True, null=True
aux colonnes où j'obtenais l'erreur. Ensuite, j'ai exécuté lapython manage.py makemigrations
commande.Immédiatement après avoir exécuté cette commande (et avant d'exécuter
python manage.py migrate
), j'ai supprimé leblank=True, null=True
de toutes les colonnes. Puis j'ai couru àpython manage.py makemigrations
nouveau. J'ai eu la possibilité de simplement modifier les colonnes moi-même, ce que j'ai sélectionné.Ensuite, j'ai couru
python manage.py migrate
et tout a bien fonctionné!la source
Ce que dit Django, c'est:
Si vous êtes sûr qu'aucune des valeurs de la
userprofile
table n'est NULL, laissez tomber et ignorez l'avertissement.La meilleure pratique dans de tels cas serait de créer une migration RunPython pour gérer les valeurs vides comme indiqué dans l'option 2
Dans la migration RunPython, vous devez trouver toutes les
UserProfile
instances avec unenew_field
valeur vide et y mettre une valeur correcte (ou une valeur par défaut comme Django vous demande de définir dans le modèle). Vous obtiendrez quelque chose comme ceci:S'amuser!
la source
Dans models.py
class UserProfile(models.Model): user = models.OneToOneField(User) website = models.URLField(blank=True) new_field = models.CharField(max_length=140, default="some_value")
Vous devez ajouter des valeurs par défaut.
la source
Si le SSH, il vous donne 2 options, choisissez le numéro 1, et mettez "Aucun". Juste ça ... pour le moment.
la source