django makemigration 在子应用程序上抛出错误

Posted

技术标签:

【中文标题】django makemigration 在子应用程序上抛出错误【英文标题】:django makemigration throw error on sub app 【发布时间】:2020-10-16 09:26:20 【问题描述】:

我通过django-admin startapp testing在我的应用程序“inventory_management”中创建了一个应用程序 项目目录如下所示,其中emporium_apparel是我的主项目,testing是我的子应用

当我运行python manage.py makemigrations

它给了

Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "C:\Users\mhashirhassan22\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\management\__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "C:\Users\mhashirhassan22\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\management\__init__.py", line 377, in execute
    django.setup()
  File "C:\Users\mhashirhassan22\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "C:\Users\mhashirhassan22\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\apps\registry.py", line 91, in populate
    app_config = AppConfig.create(entry)
  File "C:\Users\mhashirhassan22\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\apps\config.py", line 90, in create
    module = import_module(entry)
  File "C:\Users\mhashirhassan22\AppData\Local\Programs\Python\Python38-32\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 973, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'testing'

【问题讨论】:

【参考方案1】:

您需要将您的“测试”应用上移一个级别,使其看起来像这样:

- EMPORIUM_APPAREL
-- emporium_apparel
-- inventory_management
-- testing

确保您使用以下命令创建新应用:

python manage.py startapp testing

【讨论】:

我不能在 Django 中制作子应用吗? 你不能走这么多层次 - 你有你的项目,而那个项目中有应用程序。 您可以根据需要降低任意级别。软件自动化项目可以包含一个名为 project_management 的应用程序,该应用程序还可以包含“子应用程序”,如 scrum 和看板。所以有时它会有所帮助。 @hynekcer 更准确地解释了 django 在这件事上的立场【参考方案2】:

如果应用程序是嵌套的并且无法从 Python 路径导入,那么您必须在 INSTALLED_APPS 中写一个完整路径,例如inventory_management.testing 在你的情况下。应用程序的 name 将只是最后一部分,例如testing。这用于默认表名称以及迁移中。它类似于 INSTALLED_APPS 中的“django.contrib.admin”,但应用的简称为“admin”。该名称在您的项目中必须是唯一的。

“测试”这个名字似乎很笼统,可能是个问题。如果您遇到与具有名为“testing”的应用程序的其他包的名称冲突,您可以通过使用apps module 的项目的高级配置以另一个名称修复它,而无需更改任何应用程序中的任何内容。

Django 比较通用,没有“子应用”的概念。任何应用程序都可以依赖另一个应用程序,无论它是否在其目录中。

【讨论】:

inventory_management.testing 现在工作得很好。我在这里问之前尝试过,但我不知道我可能错过了一些东西非常感谢......很好解释的答案(Y)

以上是关于django makemigration 在子应用程序上抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

我应该对我的所有应用程序运行 Django“makemigrations”吗?

Django 使用数组字段在 makemigrations 上引发应用程序未加载错误

Django:添加整数字段后在应用程序上运行 makemigrations 时出现“未知列”

Django makemigrations 未检测到项目/应用程序/myapp

Django 1.7 - makemigrations 为非托管模型创建迁移

Django Makemigrations 和 Migrate 不断重复