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)
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.
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.
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="")
À 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:
id
après la création (mauvaise idée)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:
migrations.orig
../manage.py makemigrations
pour effectuer toutes les migrations.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>),
),
migrations.orig
et recherchez la migration où le modèle est créé pour la première fois . La ligne de migration ressemblera à celle ci-dessus.migrations.orig
, modifiez-la pour qu'elle corresponde au nouveau code de migration.migrations
et renommez migrations.orig
en migrations
../manage.py makemigrations
et ./manage.py migrate
. Vous ne devriez plus recevoir de message d'erreur!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.
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.
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é.
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>