Django 1.8,makemigrations没有检测到新添加的应用程序

时间:2015-10-12 06:30:02

标签: python django

我有一个带有a,b,c应用程序的现有django项目。所有这些都包含在设置文件中的已安装应用程序中。他们有自己的模型,已经运行了迁移。现在,如果我添加一个新的应用程序,添加一个模型,将其包含在已安装的应用程序中,并尝试使用python manage.py makemigrations运行一个全面的makemigrations我收到no changes detected消息。这种行为不应该像是检测到新应用并为此运行初始迁移吗?我知道我可以使用python manage.py makemigrations d手动执行此操作,但我想使用python manage.py makemigrations命令执行此操作。有人可以为这种行为提供解释吗?

2 个答案:

答案 0 :(得分:19)

如果手动创建新应用并将其添加到INSTALLED_APPS设置而不在其中添加迁移模块,系统将不会选择更改,因为这不会被视为迁移配置应用。

startapp命令会自动在新应用程序中添加迁移模块。

startapp结构

foo/
    __init__.py
    admin.py
    models.py
    migrations/
        __init__.py
    tests.py
    views.py

答案 1 :(得分:0)

Django需要一些步骤来拾取新创建的应用程序以及在其中创建的模型。

假设您使用命令messaging或通过手动添加以下目录结构创建了一个名为python manage.py startapp messaging的新应用程序:

 - project_name
     - messaging
       - migrations
         - __init__.py
       - __init__.py
       - admin.py
       - apps.py
       - models.py
       - tests.py
       - views.py
     - project_name
       - __init__.py
       - settings.py
       - urls.py
       - wsgi.py
     - manage.py

settings.py中,您需要像这样将应用添加到INSTALLED_APPS

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'messaging.apps.MessagingConfig'
]

将模型添加到models.py后,例如:

from django.contrib.auth.models import User
from django.db import models
from django.db.models import DO_NOTHING


class Thread(models.Model):
    title = models.CharField(max_length=150)
    text = models.CharField(max_length=2000)    

class Message(models.Model):
    text = models.CharField(max_length=2000, blank=True, null=False)
    user = models.ForeignKey(User, blank=False, null=False, on_delete=DO_NOTHING)
    parent = models.ForeignKey(Thread, blank=True, null=True, on_delete=DO_NOTHING)

Django在运行命令时会自动进行迁移

python manage.py makemigrations

或者如果您只想为messaging应用创建迁移,则可以

python manage.py makemigrations messaging

输出应为:

Migrations for 'messaging':   
messaging\migrations\0001_initial.py
  - Create model Thread
  - Create model Message

如果Django仍然没有使用您的新应用和模型,请确保您的python类像models.Model一样正确地继承自Thread(models.Model):,并且您在该类中定义了一些Django模型字段,例如text = models.CharField(max_length=2000, blank=True, null=False)

成功创建迁移后,可以使用

对其进行应用

python manage.py migrate(应用所有迁移)

python manage.py migrate messaging(仅适用于消息迁移)