3
votes

django demande d'ajouter des valeurs par défaut

Je suis nouveau dans django et je suis confronté à un problème.

C'était mon modèle précédent.

You are trying to add a non-nullable field 'age' to blog 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 with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option:

J'ai ajouté des données à ce modèle. Après cela, j'ai ajouté un champ supplémentaire. Maintenant, mon modèle ressemble à ceci ..

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()
    age = models.IntegerField()

Quand j'ai exécuté la commande python manage.py makemigrations j'ai eu l'erreur suivante qui est évidente.

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

Je ne veux pas ajouter default , j'ai donc supprimé le contenu de la table en accédant à db.sqlite3 p >

Mais encore une fois après avoir exécuté python manage.py makemigrations j'obtiens la même erreur.Pourquoi?


1 commentaires

Ce n'est pas une erreur. Vous essayez d'ajouter un champ à la base de données sans autoriser à être nul et sans valeur initiale. Si vous ne vous souciez pas des données actuelles de votre tableau, sélectionnez l'option 1 et entrez Aucun comme valeur par défaut à définir pour l'instant. Il devrait migrer sans aucun problème.


5 Réponses :


0
votes

Lorsque vous ajoutez un nouveau champ (c'est-à-dire une colonne) à une table de base de données, ce champ s'applique à toutes les lignes de la table ... les existantes et toutes les nouvelles. Si le champ ne peut pas être null , une valeur doit être spécifiée pour toutes les lignes existantes.

Par défaut, IntegerField () n'est pas nullable. Cela explique pourquoi vous recevez l'avertissement. Vous avez quelques options:

  • Vous pouvez choisir une valeur initiale "unique" par défaut comme le suggère Django. Toutes les lignes existantes utiliseront cette valeur pour le nouveau champ.
  • Attribuez vos propres valeurs à chaque ligne existante pour le nouveau champ.
  • Utilisez les arguments blank et null dans votre champ de modèle pour permettre au champ d'accepter des valeurs nulles.

Pour la dernière option, procédez comme suit:

models.IntegerField (blank = True, null = True)

Mais ce n'est peut-être pas le meilleur choix selon votre cas d'utilisation. Si les valeurs Nullable n'ont pas de sens pour votre champ, j'éviterais de rendre le champ NULL.


0 commentaires

0
votes
age = models.IntegerField(null=True)
Django models fields are null set to true by default.

0 commentaires

3
votes

Même si vous avez supprimé la table, toute modification apportée à votre modèle Django fera toujours référence à la migration précédente de ce modèle, il vous faudra donc toujours définir une valeur par défaut. Si vous êtes encore en développement, vous pouvez supprimer les migrations pour ce modèle, puis recommencer les migrations. Mais, c'est une pratique terrible et vous ne devriez jamais faire cela à moins que vous n'écrasiez consciemment vos modèles, la meilleure façon est de faire ce que Django vous dit et de définir une valeur par défaut. Cela aidera de toute façon à long terme avec la gestion des erreurs.

Les autres réponses expliquent assez bien comment définir les valeurs par défaut.


0 commentaires

0
votes

La façon dont vous pouvez résoudre ce problème:

  • Supprimez la table Blog de la base de données.
  • Supprimez le dossier migrations de l'application qui contient le modèle de blog.
  • Supprimez toutes les données de la table django_migrations .
  • Exécutez maintenant makemigrations , puis la commande migrate .

J'espère que cela résoudra votre problème.


0 commentaires

0
votes

Faites ce que Django vous dit, vous pouvez alors supprimer l'attribut default si vous n'en avez pas besoin. Mais c'est une bonne pratique de le garder quand même


0 commentaires