【问题标题】:Importing models between apps in Django 1.9在 Django 1.9 中的应用程序之间导入模型
【发布时间】:2016-03-07 04:15:15
【问题描述】:

我刚刚在 Django 1.9 中开始一个新项目,由于某种原因无法将我的模型从一个应用程序导入到另一个应用程序。以下是我的文件结构:

├── apps
    ├── __init__.py
    ├── main
        |--__init__.py
        |--models.py
    └── contacts
        |--__init__.py
        |--models.py
├── config
    ├── __init__.py
    ├── settings.py
    └── wsgi.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',
    'apps.main',
    'apps.contacts',
]

由于某种原因,自从升级到 1.9,这个导入

from apps.main.models import BaseUser

在 contacts/models.py 中返回以下错误。

Traceback (most recent call last):   
File "./manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)   
File "/Users/kendallcole/.virtualenvs/trickledowncrm/lib/python2.7/site-packages/django/core/management/__init__.py", line 350, in execute_from_command_line
    utility.execute()   
File "/Users/kendallcole/.virtualenvs/trickledowncrm/lib/python2.7/site-packages/django/core/management/__init__.py", line 324, in execute
    django.setup()   
File "/Users/kendallcole/.virtualenvs/trickledowncrm/lib/python2.7/site-packages/django/__init__.py", line 18, in setup
    apps.populate(settings.INSTALLED_APPS)   
File "/Users/kendallcole/.virtualenvs/trickledowncrm/lib/python2.7/site-packages/django/apps/registry.py", line 108, in populate
    app_config.import_models(all_models)   
File "/Users/kendallcole/.virtualenvs/trickledowncrm/lib/python2.7/site-packages/django/apps/config.py", line 202, in import_models
    self.models_module = import_module(models_module_name)   
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)   
File "/Users/kendallcole/Desktop/trickledowncrm/apps/contacts/models.py", line 4, in <module>
    from apps.main.models import BaseUser 
ImportError: No module named main.models

【问题讨论】:

  • 如果您单独导入模型而不是通过*,此问题是否仍然存在?
  • 是的,我将编辑问题以反映这一点。
  • 除了 Django 版本之外还有什么变化吗?一个新的虚拟环境?更改为 PYTHONPATH?还有什么?
  • change log of 1.9 文档中,他们提到了关于导入模块的内容已更改,但我不知道如何使用它们。

标签: django python-2.7 django-models


【解决方案1】:

我使用Django apps registry described here 解决了这个问题。

我试图从另一个名为 warehouse 的应用导入模型:

from warehouse.models import Member

这给了我同样的错误。我通过将模型分配给变量而不是尝试导入 warehouse 模型来解决它:

from django.apps import apps

class ModelFromAnotherApp(models.Model):
    ...
    def method_using_model_from_another_app:
        member = apps.get_model('warehouse.Member')
        x = members.objects.filter(...)
    ...

【讨论】:

  • 如何发布引用外部资源的好答案的绝佳示例!
【解决方案2】:

将您的应用程序目录名称更改为 app.如果您使用 startapp 命令创建了应用程序,则有一个名为 apps.py 的文件。我认为这是造成冲突的原因。

├── app
    ├── __init__.py
    ├── main
        |--__init__.py
        |--models.py
    └── contacts
        |--__init__.py
        |--models.py
├── config
    ├── __init__.py
    ├── settings.py
    └── wsgi.py

【讨论】:

    【解决方案3】:

    我遇到了类似的问题,我在 1.8 开始了一个项目,然后升级到 1.9。一切正常,直到我在 1.9 升级后创建了一个新应用程序。我刚刚删除了新应用程序中的apps.py 文件,一切又正常了。不知道为什么这是一个问题

    【讨论】:

    • 嗨。我有同样的问题,你的回答帮助了我。你能告诉我为什么删除 apps.py 有帮助吗?
    猜你喜欢
    • 2017-09-30
    • 2016-03-15
    • 2011-05-07
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多