Django 1.7 - makemigrations not detecting changes
As the title says, I can't seem to get migrations working.
The app was originally under 1.6, so I understand that migrations won't be there initially, and indeed if I run python manage.py migrate
I get:
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.
If I make a change to any models in myapp
, it still says unmigrated, as expected.
But if I run python manage.py makemigrations myapp
I get:
No changes detected in app 'myapp'
Doesn't seem to matter what or how I run the command, it's never detecting the app as having changes, nor is it adding any migration files to the app.
Is there any way to force an app onto migrations and essentially say "This is my base to work with" or anything? Or am I missing something?
My database is a PostgreSQL one if that helps at all.
Solution 1:
If you're changing over from an existing app you made in django 1.6, then you need to do one pre-step (as I found out) listed in the documentation:
python manage.py makemigrations your_app_label
The documentation does not make it obvious that you need to add the app label to the command, as the first thing it tells you to do is python manage.py makemigrations
which will fail. The initial migration is done when you create your app in version 1.7, but if you came from 1.6 it wouldn't have been carried out. See the 'Adding migration to apps' in the documentation for more details.
Solution 2:
This may happen due to the following reasons:
- You did not add the app in
INSTALLED_APPS
list insettings.py
(You have to add either the app name or the dotted path to the subclass of AppConfig in apps.py in the app folder, depending on the version of django you are using). Refer documentation: INSTALLED_APPS - You don't have
migrations
folder inside those apps. (Solution: just create that folder). - You don't have
__init__.py
file insidemigrations
folder of those apps. (Solution: Just create an empty file with name __init__.py) - You don't have an
__init__.py
file inside the app folder. (Solution: Just create an empty file with name __init__.py) - You don't have a
models.py
file in the app - Your Python class (supposed to be a model) in
models.py
doesn't inheritdjango.db.models.Model
- You have some semantic mistake in definition of models in
models.py
Note:
A common mistake is to add migrations
folder in .gitignore
file. When cloned from remote repo, migrations
folder and/or __init__.py
files will be missing in local repo. This causes problem.
I suggest to gitignore migration files by adding the following lines to .gitignore
file
*/migrations/*
!*/migrations/__init__.py
Solution 3:
Ok, looks like I missed an obvious step, but posting this in case anyone else does the same.
When upgrading to 1.7, my models became unmanaged (managed = False
) - I had them as True
before but seems it got reverted.
Removing that line (To default to True) and then running makemigrations
immediately made a migration module and now it's working. makemigrations
will not work on unmanaged tables (Which is obvious in hindsight)