Django makemigrations not detecting project/apps/myapp

danbal picture danbal · Sep 24, 2016 · Viewed 8k times · Source

Solved

Interesting:

  • ./manage.py makemigrations apps.myapp -> "App 'apps.myapp' could not be found. Is it in INSTALLED_APPS?"
  • ./manage.py makemigrations myapp -> Works.
  • ./manage.py makemigrations -> "No changes detected" (it does detect changes if myapp is in the project root)



Original question:

Project structure

myproject/
    myproject/
    apps/
        myapp/
            __init__.py
            admin.py
            models.py
            urls.py
            views.py
            tests.py
        myapp2/
        myapp3/
        __init__.py
    static/
    templates/
    virtualenv/
    manage.py

myproject/apps/myapp/models.py

from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=200)
    created = models.DateTimeField(auto_now_add=True)

Settings.py

INSTALLED_APPS = [
    # ...
    'apps.myapp',
    'apps.myapp2',
    'apps.myapp3',
]

makemigrations cannot find "myapps" that's not in the project root.
At the same time, migrate does find it.

$ ./manage.py makemigrations apps.myapp
App 'apps.myapp' could not be found. Is it in INSTALLED_APPS?

$ ./manage.py migrate apps.myapp
CommandError: App 'apps.myapp' does not have migrations.

Isn't the "let's put our apps into an apps folder" practise valid any more, am I doing something wrong, or is it a bug of the makemigrations command?

Note1: before running makemigrations, I removed the "migrations" folder of myapp, but I'm pretty sure it doesn't matter. It did get re-created when the app was in the project root.

Note2: I did research google and stackoverflow, I only found similar questions where the solution was either "adding the app to settings.py", "running makemigrations before migrate" or "some migration issue between Django 1.6 and 1.7". None of these apply to my situation, I think.

Answer

Shinto Joseph picture Shinto Joseph · Jun 15, 2019

You may have deleted the migrations folder inside the app or __init__.py inside the <app>/migrations/ folder, create a new one

myproject/
apps/
    myapp/
        migrations/
            __init__.py

You can always do makemigrations seperately without doing the above step

python manage.py makemigrations myapp