Django 1.7 - makemigrations pas la détection des changements

comme le titre le dit, Je n'arrive pas à faire fonctionner les migrations.

l'application était à l'origine sous 1.6, donc je comprends que les migrations ne seront pas là initialement, et en effet si je cours python manage.py migrate je reçois:

Operations to perform:
  Synchronize unmigrated apps: myapp
  Apply all migrations: admin, contenttypes, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
  Installing custom SQL...
  Installing indexes...
Running migrations:
  No migrations to apply.

si je fais un changement à n'importe quel modèle dans myapp , il dit toujours non émigré, comme prévu.

mais si je cours python manage.py makemigrations myapp j'obtiens:

No changes detected in app 'myapp'

ne semble pas avoir d'importance ou comment j'exécute la commande, il ne détecte jamais l'application comme ayant des changements, ni n'ajoute de fichiers de migration à l'application.

y a-t-il un moyen de forcer une application sur les migrations et de dire essentiellement "C'est ma base pour travailler avec" ou autre chose? Ou ai-je raté quelque chose?

ma base de données est une PostgreSQL si cela peut aider.

122
demandé sur Maxime Lorant 2014-07-23 17:44:54

23 réponses

si vous changez d'une application existante que vous avez créée dans django 1.6, alors vous devez faire une étape préalable (comme je l'ai découvert) listée dans la documentation:

python manage.py makemigrations your_app_label

la documentation ne rend pas évident que vous devez ajouter l'étiquette app à la commande, car la première chose qu'elle vous dit de faire est python manage.py makemigrations qui échouera. Initial la migration est faite lorsque vous créez votre application dans la version 1.7, mais si vous venez de 1.6, elle n'aurait pas été effectuée. Voir le " ajouter la migration aux applications " dans la documentation pour plus de détails.

168
répondu drojf 2014-10-18 11:50:42

Ok, on dirait que j'ai manqué une étape évidente, mais en postant ceci au cas où quelqu'un d'autre ferait la même chose.

lors de la mise à niveau à 1.7, mes modèles sont devenus non - gérés ( managed = False ) - je les avais comme True avant mais semble qu'il a été inversé.

supprimer cette ligne (par défaut à True) et puis lancer makemigrations immédiatement fait un module de migration et maintenant il fonctionne. makemigrations ne fonctionnera pas sur des tables non gérées (ce qui est évident dans avec le recul)

25
répondu TyrantWave 2014-07-24 09:07:38

ma solution n'était pas couverte ici donc je l'affiche. J'avais utilisé syncdb pour un projet–juste pour le faire fonctionner. Puis quand j'ai essayé de commencer à utiliser Django migrations, il a simulé au début puis dirait que C'était "OK", mais rien ne se passait à la base de données.

ma solution était de simplement supprimer tous les fichiers de migration pour mon application, ainsi que comme les enregistrements de base de données pour les migrations de l'application dans la table django_migrations .

alors je viens de faire une migration initiale avec:

./manage.py makemigrations my_app

suivi de:

./manage.py migrate my_app

maintenant je peux faire des migrations sans problème.

18
répondu Grant Eagon 2015-01-23 06:47:33

cela peut arriver pour les raisons suivantes:

  1. Vous n'avez pas ajouter l'application dans INSTALLED_APPS liste settings.py (Vous devez ajouter soit le nom d'application ou le chemin en pointillés à la sous-classe de AppConfig en apps.py dans le dossier app, en fonction de la version de django que vous utilisez). Référence de la documentation: INSTALLED_APPS
  2. vous n'avez pas migrations dossier à l'intérieur de ces applications. (Solution: il suffit de créer ce dossier).
  3. vous n'avez pas __init__.py fichier à l'intérieur migrations dossier de ces applications. (Solution: il suffit de créer un fichier vide avec le nom _ _ init__.py )
  4. vous n'avez pas de fichier __init__.py à l'intérieur de l'application dossier. (Solution: il suffit de créer un fichier vide avec le nom _ _ init__.py )
  5. Vous n'avez pas de models.py fichier dans l'application
  6. votre classe Python (supposée être un modèle) dans models.py n'hérite pas django.db.models.Model
  7. vous avez une erreur sémantique dans la définition des modèles dans models.py

Note: Une erreur courante est d'ajouter migrations dans le dossier .gitignore . Lorsque les fichiers migrations et/ou __init__.py sont clonés à partir d'un fichier repo distant, ils sont absents du fichier repo local. Cela cause problème.

je suggère d'ignorer les fichiers de migration en ajoutant les lignes suivantes à .gitignore fichier

*/migrations/*
!*/migrations/__init__.py
17
répondu Mohammed Shareef C 2018-01-30 06:42:15

D'accord avec @furins. Si tout semble être en ordre et pourtant ce problème se pose, Vérifiez s'il y a une méthode de propriété avec le même titre que l'attribut que vous essayez d'ajouter dans la classe Model.

  1. supprimer la méthode avec un nom similaire à l'attribut que vous ajoutez.
  2. manage.py migrations de masse 151940920"
  3. manage.py migrer my_app
  4. ajouter les méthodes.
15
répondu Prashant Nair 2016-01-30 07:27:22

c'est un peu une erreur stupide à faire, mais avoir une virgule supplémentaire à la fin de la ligne de déclaration de champ dans la classe de modèle, rend la ligne sans effet.

il arrive quand vous copiez coller le def. de la migration, qui elle-même est définie comme un tableau.

Mais peut-être que ce serait aider quelqu'un :-)

11
répondu Iman Akbari 2017-08-11 00:50:42

, La réponse est sur ce stackoverflow post, par cdvv7788 les Migrations dans Django 1.7

si c'est la première fois que vous migrez cette application, vous devez utiliser:

manage.py makemigrations myappname une fois que vous faites que vous pouvez faire:

manage.py migrer si vous aviez votre application dans la base de données, modifié son modèle et il ne met pas à jour les changements sur makemigrations vous probablement havent migré il encore. Changez votre modèle de nouveau à sa forme originale, exécutez le première commande (avec le nom de l'application) et de migrer..., il sera faux. Lorsque vous faites cela remettre les changements sur votre modèle, exécuter makemigrations et migrer à nouveau et ça devrait marcher.

j'avais exactement le même problème et faire ce qui précède fonctionnait parfaitement.

j'avais déplacé mon application django vers cloud9 et pour une raison quelconque je n'ai jamais capté la migration initiale.

7
répondu MicahT 2017-05-23 11:47:28

peut-être que ça aidera quelqu'un. J'utilisais une application imbriquée. projet.appname et moi avions en fait projet et projet.appname in INSTALLED_APPS. La suppression du projet de INSTALLED_APPS a permis de détecter les changements.

6
répondu jaywhy13 2015-04-09 01:40:02

les gens comme moi qui n'aiment pas les migrations peuvent utiliser les étapes ci-dessous.

  1. Supprimer les modifications que vous souhaitez synchroniser.
  2. Exécuter python manage.py makemigrations app_label pour la migration initiale.
  3. Exécuter python manage.py migrate pour la création des tables avant d'apporter des modifications.
  4. coller les modifications que vous retirez à la première étape.
  5. course 2. et 3. étape.

si vous avez confondu ces étapes, lire les fichiers de migration. Modifiez-les pour corriger votre schéma ou supprimer les fichiers indésirables, mais n'oubliez pas de modifier la partie dépendances du fichier de migration suivant;)

j'espère que cela aidera quelqu'un à l'avenir.

6
répondu Deniz Kaplan 2015-12-09 00:36:52

après a travaillé pour moi:

  1. ajouter le nom de l'application settings.py
  2. use ' python manage.py migrations
  3. utiliser "python manage.py migrer'

travaillé pour moi: Python 3.4, Django 1.10

6
répondu Pranshu Gupta 2016-10-26 06:34:07

peut-être que je suis en retard mais avez-vous essayé d'avoir un dossier migrations dans votre application avec un fichier __init__.py ?

6
répondu rrrub 2018-10-03 20:05:38

vous souhaitez vérifier le settings.py dans la liste INSTALLED_APPS et assurez-vous que toutes les applications avec des modèles sont énumérés dans il.

exécuter makemigrations dans le dossier du projet signifie qu'il cherchera à mettre à jour toutes les tables liées à toutes les applications incluses dans settings.py pour le projet. Une fois que vous l'incluez, makemigrations incluera automatiquement l'application (cela économise beaucoup de travail pour que vous n'ayez pas à lancer makemigrations app_name pour chaque application de votre projet/site).

5
répondu Sticky 2015-06-14 01:26:48

juste au cas où vous avez un champ spécifique qui ne s'identifie pas par makemigrations: cochez deux fois si vous avez une propriété avec le même nom.

exemple:

field = django.db.models.CharField(max_length=10, default = '', blank=True, null=True)

# ... later

@property
def field(self):
    pass

la propriété "écrasera" la définition du champ afin que les changements ne soient pas identifiés par makemigrations

4
répondu furins 2015-08-31 03:15:01

ajoutant cette réponse parce que seule cette méthode m'a aidé.

j'ai supprimé le migrations "151990920 dossier" exécuter makemigrations et migrate .

Il dit toujours: pas de migrations à appliquer.

je suis allé dans le dossier migrate et j'ai ouvert le dernier fichier créé,

commentaire de la migration je voulais(Il a été détecté et est entré il)

et encore migrate .

ceci édite essentiellement le fichier migrations manuellement.

ne faites ceci que si vous comprenez le contenu du fichier.

4
répondu Jithin Pavithran 2016-07-10 13:03:18

assurez-vous que votre modèle n'est pas abstract . J'ai fait cette erreur et ça a pris du temps, alors j'ai pensé la poster.

4
répondu Mark 2016-11-15 15:49:44

est-ce que vous avez utilisé schemamigration my_app --initial après avoir renommé l'ancien dossier de migration? Essayer. Pourrait fonctionner. Si ce n'est pas le cas, essayez de recréer la base de données et de faire migrer syncdb+. Il a travaillé pour moi...

3
répondu Alex Vidis 2014-07-23 14:23:55

j'ai eu le même problème avec avoir à exécuter makemigrations deux fois et toutes sortes de comportement étrange. Il s'est avéré que la racine du problème était que j'utilisais une fonction pour fixer des dates par défaut dans Mes modèles donc les migrations détectaient un changement à chaque fois que j'lançais des migrations de makemigrations. La réponse à cette question m'a mis sur la bonne voie: éviter les migrations de makemigrations pour recréer le champ date

1
répondu PhoebeB 2014-12-11 20:21:18

J'ai récemment mis à jour Django de 1,6 à 1,8 et j'ai eu peu d'applications et de migrations pour eux. J'ai utilisé le Sud et schemamigrations pour créer des migrations dans Django 1.6, qui est tombé dans Django 1.8.

lorsque j'ai ajouté de nouveaux modèles après la mise à niveau, la commande makemigrations ne détectait aucun changement. Et puis j'ai essayé la solution suggérée par @drojf (1ère réponse), ça a bien fonctionné, mais pas réussi à appliquer une fausse migration initiale ( python manage.py --fake-initial ). Je faisais ceci comme mes tables (Vieux les tables) ont déjà été créés.

enfin cela a fonctionné pour moi, a supprimé les nouveaux modèles (ou les changements de modèle) de models.py et puis il a fallu supprimer (ou renommer pour la sauvegarde de sécurité) le dossier de migration de toutes les applications et exécuter python manage.py makemigrations pour toutes les applications, puis a fait python manage.py migrate --fake-initial . Cela a fonctionné comme un charme. Une fois que la migration initiale est créée pour toutes les applications et faux initiale migré, puis ajouté de nouveaux modèles et suivi le processus régulier de makemigrations et de migrer sur cette application. Les changements ont été détectés et tout s'est bien passé.

j'ai juste pensé le partager ici, si quelqu'un fait face au même problème (ayant schemamigrations du Sud pour leurs applications), il pourrait les aider:)

1
répondu RaghavHarpale 2017-02-28 06:21:24

Peut-être que peut aider quelqu'un, j'ai eu le même problème.

j'ai déjà créé deux tables avec la classe serializer et les vues. Donc quand j'ai voulu mettre à jour, j'ai eu cette erreur.

j'ai suivi ces étapes:

  1. j'ai fait .\manage.py makemigrations app
  2. j'ai exécuté .\manage.py migrate
  3. j'ai effacé les deux tableaux de mon models.py
  4. j'ai tout effacé référence à mes tables de serializer et view class.
  5. j'ai exécuté l'étape 1 et 2 .
  6. j'ai récupéré mes modifications juste dans le models.py
  7. j'ai de nouveau effectué l'étape 5 .
  8. j'ai restauré tous mes changements.

Si vous travaillez avec Pycharm, l'histoire locale est très utile.

1
répondu winter 2017-03-29 18:59:19

peut-être que ça aidera quelqu'un.

j'ai supprimé mon models.py et je m'attendais à ce que makemigrations crée des déclarations DeleteModel .

N'oubliez pas de supprimer les fichiers *.pyc !

1
répondu Sebastian Wagner 2017-05-11 11:32:31
./manage makemigrations
./manage migrate

Migrations suivre les changements à la base de données ainsi si vous êtes en train de passer de non géré à géré, vous aurez besoin de vous assurer que votre table de base de données est à jour en ce qui concerne le modèle que vous traitez.

si vous êtes toujours en mode dev, j'ai personnellement décidé de supprimer les fichiers de migration dans mon IDE ainsi que dans la table django_migrations relative à mon modèle et de relancer la commande ci-dessus.

rappelez-vous: si vous avez une migration qui se termine avec _001 dans votre IDE et _003 dans votre base de données. Django ne verra que si vous avez une migration se terminant par _004 pour quelque chose à mettre à jour.

les migrations 2 (code & db) sont liées et fonctionnent en tandem.

Heureux de codage.

1
répondu A H Bensiali 2017-05-21 12:52:22

a ajouté cette réponse parce qu'aucune des autres réponses disponibles ci-dessus ne fonctionnait pour moi.

dans mon cas quelque chose d'encore plus étrange se passait ( Django 1.7 Version ), dans mon models.py j'avais une ligne " extra à la fin de mon fichier (c'était une ligne vide) et quand j'ai exécuté la commande python manage.py makemigrations le résultat était: "aucun changement détecté".

pour corriger ce I supprimé cette "ligne blanche " qui était à la fin de mon models.py fichier et j'ai lancé la commande à nouveau, tout a été corrigé et tous les changements apportés à models.py ont été détectés!

0
répondu Huskie 2018-02-17 13:36:25

ajoutant mon 2c, puisqu'aucune de ces solutions n'a fonctionné pour moi, mais cela a fonctionné...

je venais juste d'exécuter manage.py squashmigrations et de supprimer les anciennes migrations (à la fois les fichiers et les lignes dans le django.les migrations de la table de base de données).

cela a laissé une ligne comme celle-ci dans le dernier fichier de migration:

replaces = [(b'my_app', '0006_auto_20170713_1735'), (b'my_app', '0007_auto_20170713_2003'), (b'my_app', '0008_auto_20170713_2004')]

ce Django apparemment confus et causé un comportement étrange: courir manage.py makemigrations my_app recréerait la migration initiale comme si il n'en existait pas. La suppression de la ligne replaces... a réglé le problème!

-1
répondu webtweakers 2017-07-17 12:14:33