web-dev-qa-db-fra.com

makemigrations ne détecte pas les changements de modèle

J'utilise Django 1.9.6. J'ai récemment supprimé mes migrations et ai exécuté migrate --run-syncdb et makemigrations my_app. Aujourd'hui, j'ai ajouté un nouveau champ à l'un de mes modèles:

models.py:

value = models.PositiveSmallIntegerField(null=True)

J'ai essayé de migrer les modifications, mais makemigrations ne détecte pas les modifications. C'est juste la version de développement, donc je peux resynchroniser (je n'ai pas besoin de conserver les données), mais exécuter à nouveau --run-syncdb ne le détecte pas non plus.

Pourquoi est-ce que cela ne migre pas?

8
Escher

Vous ne devez pas supprimer les migrations, vous devez les écraser . Si vous supprimez simplement les fichiers, vous risquez de gâcher le processus, le moyen le plus simple de récupérer consiste à resynchroniser votre code pour récupérer les fichiers. Un itinéraire plus complexe consiste à supprimer tous les enregistrements de la table Django_migrations et à ré-initier les migrations à partir de zéro, mais il y a plus d'étapes/de problèmes que je ne peux vraiment aborder et je ne le recommande pas.

La raison pour laquelle makemigrations ne détecte pas le changement est probable car il n'y a pas de dossier de migration dans cette application. Si vous exécutez python manage.py makemigrations your_app --initial, il est possible que les migrations soient détectées et générées, ou que vous soyez pris de panique à cause de la différence entre vos fichiers et la table Django_migrations.

La commande --run-syncdb est idéale lorsque les données vous importent peu, généralement avant de déployer réellement mais une fois que vous commencez à utiliser des migrations, vous ne devriez plus utiliser la commande --run-syncdb. Par exemple, lors du développement initial, voici le code par lequel je lance chaque changement de modèle au lieu de gérer les migrations:

dropdb mydb && createdb mydb && python manage.py migrate --run-syncdb && python manage.py loaddata initial

Je stocke toutes les données initiales dans un fichier fixtures et la commande efface la totalité de la base de données, le --run-syncdb reconstruit le schéma et les données initiales sont chargées tout en ignorant les fichiers de migration réels.

Ainsi, si vous ne vous souciez pas de vos données ou si vous pouvez facilement les déplacer vers un appareil, vous pouvez les supprimer et les recréer. Vous êtes alors libre de supprimer tous les dossiers de migration et vous pouvez utiliser la commande ci-dessus jusqu'à ce que vous deveniez actif et que vous deviez passer à l'utilisation des migrations.

MISE À JOUR POUR Django 1.11

J'ai commencé à utiliser Django 1.11 et j'ai remarqué que le framework de test pouvait échouer si vous aviez des dépendances sur des modèles de framework et si vous ne réalisiez pas de migration. C’est la nouvelle commande que j’utilise pour tout effacer et tout recommencer tout en se développant.

dropdb yourdb && createdb yourdb && find . -name "migrations" -type d -Prune -exec rm -rf {} \; && python manage.py makemigrations name every app you use seperated by space && python manage.py migrate && python manage.py loaddata initial

Je mets ceci dans un builddb.sh à la racine de mon projet (à côté de manage.py) afin que je puisse simplement exécuter ./builddb.sh. Assurez-vous de le supprimer lors du déploiement pour éviter les accidents!

9
dotcomly

Supprimez tous les fichiers de migration antérieurs et les fichiers __pycache__ à l'exception de __init __ Then:

python manage.py makemigrations yourApp 

Après cela, assurez-vous que la base de données est identique au code de model.py (supprimer les nouvelles modifications) et exécutez la ligne suivante:

python manage.py migrate --fake-initial

Ajoutez maintenant toutes vos modifications dans le fichier model.py et exécutez les lignes suivantes:

python manage.py makemigrations 
python manage.py migrate

Cordialement, Kristian

18
Kristian

J'ai eu le même problème. J'ai réalisé que j'avais une propriété définie sur le modèle avec le même nom qu'un champ que j'essayais d'ajouter au modèle. Assurez-vous que le modèle ne possède pas de propriété/méthode de modèle portant le même nom que le champ que vous essayez d'ajouter. 

9
Liyosi

Si vous supprimez un modèle et attendez que les modifications soient prises en compte lors des migrations, assurez-vous que le modèle ne contient pas de *.pyc.

0
cdosborn