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