14
votes

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.

3
RE: Note1, yes it matters - if there is no migrations folder, it will not create one nor will it create migrations.Jens Astrup
It does create the migrations folder if myapp is in the project root.danbal
I started a new app, moved under the "apps" directory, it has "migrations" folder. I'm getting the same error.danbal
did u pass app_label in Meta class: if pass then u have to give app_label also.Mushahid Khan

3 Answers

16
votes

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
7
votes

try

INSTALLED_APPS = [
    # ...
    'myproject.apps.myapp',
]

and

python manage.py makemigrations myapp 
1
votes

It's works now. It didn't work before because I didn't make any changes to my model. I'm new to django and was trying to execute the command from the videos I watched. Django documentation tells you that makemigrations create new migrations based on the changes you made to your model. So, I make changes in models.py and admin.py and it's working now.