web-dev-qa-db-fra.com

Vous essayez d'ajouter un champ 'id' non nullable à contact_info sans valeur par défaut

j'utilise simplement la commande simple python manage.py makemigrations

Cependant, tout ce que je reçois est cette erreur:

You are trying to add a non-nullable field 'id' to contact_info 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

Voici models.py:

class Document(models.Model):
    docfile = models.FileField(upload_to='documents/')


class contact_number(models.Model):
    contact_numbers= models.CharField(max_length=13)

class contact_address(models.Model):
    address = models.CharField(max_length=100)
    city = models.CharField(max_length=50)
    state = models.CharField(max_length=50)
    Zip = models.CharField(max_length=5)

class contact_info(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.EmailField()
    contact_numbers=models.ManyToManyField(contact_number)
    addresses=models.ManyToManyField(contact_address)
6
shashank

vous pouvez définir `default =" "et aussi editable = False.

E.g first_name = models.CharField(max_length=50, default="", editable=False).

L'ajout d'un champ d'identification est inutile. Django l'ajoutera automatiquement.

Modifier: Supprimez les derniers fichiers de migration de votre dossier de migration et réessayez. Si cela ne fonctionne pas, répétez le même processus, vous saurez que vous avez supprimé le bon fichier lorsque votre commande "makemigrations" fonctionne.

3
pycod333

Cela se produit lorsqu'un champ différent a été marqué comme clé primaire avec primary_key=True plus tôt et que vous le supprimez (dans le cas où Django tente d'ajouter une clé primaire id).

Le fait que Django demande une valeur par défaut pour une clé primaire semble être un bogue. 

Pour contourner ce problème, procédez comme suit:

1) Fournissez une valeur aléatoire par défaut lorsque vous y êtes invité lors de makemigrations.

2) Accédez au fichier de migration généré (sous your_app\migrations\ et supprimez le default=x,, x étant la valeur aléatoire fournie à l'étape 1).

3) Lorsque vous êtes dans le fichier de migration, assurez-vous que l’ordre des actions est logique (par exemple, supprimez/modifiez une clé primaire avant d’en ajouter une autre). Sauver et fermer. 

4) Migrez comme d'habitude. 

21
mehmet

Vous devez définir une valeur par défaut. Par exemple:

field_eg = models.CharField(default="")

veux dire:

name = models.CharField(max_length=100, default="")
1
Anil Kumar Gupta

À mon avis, supprimer complètement les migrations est une mauvaise idée. J'ai fait un snafu semblable à @Afiz Momin et j'ai pu me sortir de moi-même.

J'ai eu la configuration suivante:

  1. Une base abstract model.
  2. Remplacer le champ id après la création (mauvaise idée)
  3. Toutes les autres sous-classes ont déclenché des migrations Django pour essayer de créer le champ ID à partir de la classe parent.

Donc j'obtiendrais le suivant à chaque fois J'ai couru makemigrations:

You are trying to add a non-nullable field 'id' to <tablename> 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

Mais il y avait un moyen de sortir.

Lors de ma première tentative, je souhaitais simplement insérer une valeur fictive dans la colonne id créée, puis supprimer celle-ci, mais cela était évidemment insoutenable. Mais sur un coup de tête j'ai fait ce qui suit:

  1. Sauvegardez le répertoire des migrations sur migrations.orig.
  2. Exécutez ./manage.py makemigrations pour effectuer toutes les migrations.
  3. Inspectez le fichier de migration nouvellement créé 0001-initial.

Il y a des chances que le modèle dont il se plaint (<tablename>) manque des informations vitales. Pour moi, il manquait l'argument bases:

migrations.CreateModel(
    name='<ModelName>',
        fields=[
            ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
            ('some_field', models.IntegerField()),
            # ... other fields ...
        ],
        options={
            'abstract': False,
        },
        bases=(<base_classes>),
    ),
  1. Retournez maintenant dansmigrations.origet recherchez la migration où le modèle est créé pour la première fois . La ligne de migration ressemblera à celle ci-dessus.
  2. Une fois que vous avez trouvé la ligne dans migrations.orig, modifiez-la pour qu'elle corresponde au nouveau code de migration.
  3. Restaurez vos migrations d'origine. Supprimez migrations et renommez migrations.orig en migrations.
  4. Juste pour faire bonne mesure, exécutez ./manage.py makemigrations et ./manage.py migrate. Vous ne devriez plus recevoir de message d'erreur!
  5. S'il se plaint d'un autre modèle, suivez la même procédure décrite.
0
Dash2TheDot

Cela peut également se produire si vous apportez des modifications à votre fichier models.py et essayez de migrer par la suite. M'est arrivé une fois. Supprimer toute la base de données n'a pas aidé après tout. Si l'erreur survient après l'ajout d'une clé étrangère, vous ne pouvez pas fournir de valeur par défaut. Il peut également être dangereux de définir la valeur par défaut comme nulle.

Django a probablement encore quelques-uns des fichiers de migration précédents dans votre dossier myapp/migrations /. La suppression de ces fichiers peut aider.

0
Chandan

Cela se produit parce que vous avez une base de données non vide. Il doit y avoir une ligne qui n’a pas été créée par Django ORM.

Procédez comme suit: Python manage.py Shell

from <path_to_your_models> import *
print len(list(contact_info.objects.filter(id = None)))

De cette façon, vous saurez combien il y a de telles lignes. Si vous souhaitez les conserver, créez un script de migration avec une valeur que vous lui attribuez.

0
Jan Skácel

J'ai rencontré un problème similaire lors de la migration. J'avais la clé primaire avec le nom 'Identity' et d'autres champs dans mes modèles auxquels j'ai appliqué makemigrations. Plus tard, j'ai changé le nom de la clé primaire en '_id' et j'ai eu cette erreur. 

Vous essayez d'ajouter un champ '_id' non nullable à swapidentity sans valeur par défaut; nous ne pouvons pas faire cela (la base de données a besoin de quelque chose pour remplir les lignes existantes).

Une erreur est un peu trompeuse, mais si vous rétablissez "_id" en "Identité", vous n'obtiendrez pas cette erreur. 

Comment résoudre ce problème? Supprimez le script de migration généré sous le package de migration. Ou modifiez manuellement la clé primaire dans votre script de migration généré.

0
Afiz

Vérifiez vos fichiers de migration

./manage.py showmigrations <App Name>

[X] 0001_initial

[X] 0002_auto_20181204_1110

Annuler vos migrations en utilisant

./manage.py migrate <App Name> <migration file name> Exemple: 0001_initial ou utiliser zéro (pour rétablir la migration complète) 

Vérifiez vos migrations

./manage.py showmigrations <App Name>

[] 0001_initial

[] 0002_auto_20181204_1110

Supprimez maintenant toutes les migrations inversées et migrez à nouveau.

./manage.py migrate <App Name>

0
sarath kumar