无法从 Django 中的另一个应用程序导入模型

Cannot import models from another app in Django

所以我在同一个项目中有 2 个应用 运行。

我的文件结构如下:

/project_codebase
    /project
        __init.py
        settings.py
        urls.py
        wsgi.py
        ...    
    /app1
        ...
    /app2
        ...
    manage.py

因此,出于某种奇怪的原因,我的基本目录有一个不同的名称(也就是说,它以代码库结尾)。希望这不是问题。

在我的 settings.py 中,我有这个:

INSTALLED_APPS = [
    ...

    'app1',
    'app2',
]

好的,所以在我的 models.py(来自 app2) 中,我可以使用 from app1.models import * 轻松地从 app1 导入模型,但是,当我使用 from app2.models import * 在我的 models.py(来自 app1) 中,我得到一个 ImportError。

有什么解决办法吗?

您需要指定要导入的模型名称,例如 from app1.models import ModelName1, ModelName2

这可能是由于 循环导入 问题。为避免这种情况,您应该动态加载模型:

对于 最新版本的 django (1.7+) 使用 application registry:

from django.apps import apps
MyModel1 = apps.get_model('app1', 'MyModel1')

对于 早期的 django 版本 (<1.7):

from django.db.models.loading import get_model
MyModel1 = get_model('app1', 'MyModel1')

注1:如果要定义ForeignKey关系,则不需要单独导入声明。 Django has you covered 关于这个:

如果app1是已安装的应用程序,则应按如下方式定义ForeignKey关系:

# in app2.py
class MyModel2(models.Model):
   mymodel1 = models.ForeignKey('app1.MyModel1')

注意 2get_model 仅在 app1 是已安装的应用程序且 MyModel1 是您要从中导入的模型时才有效app1.

注3:尽量避免通配符导入(from ... import *),如this is bad practice.

肯定是循环导入

但我认为您需要的是将模型用作某种 RetationFields(ForeignKeyManyToManyFieldOneToOneField) 参数。所以你需要跳过导入并这样使用:

# app1/models.py
class Model1(models.Model):
    relation_field = models.ForeignKey('app2.Model2')

来自docs

If you need to create a relationship on a model that has not yet been defined, you can use the name of the model, rather than the model object itself

To refer to models defined in another application, you can explicitly specify a model with the full application label

只需将 str 对象作为指向 <app_name>.<Model_name>.

的关系字段的第一个参数

注意:最好避免从模块(from <module_name> import *)

导入所有内容

如果您只想导入某些特定模块,请不要使用 import *

加载所有库需要更多时间,因此也会影响应用程序的速度。

如果您想使用第二个应用中的几个模块,那么只需添加模块名称而不是整个库,如下所示:

from app2.models import Module1, Module2

也可能是其他人澄清的循环导入问题。

谢谢。

我一直使用这段代码,它很管用:)

from position_app.models import Member

确保您的应用程序之一与安装在 Python 环境中的模块之一之间没有名称冲突。如果你使用 pip,你可以 运行 pip freeze 查看已安装模块的列表。

当我的一个应用程序被命名为 'packaging' 并且安装了打包 python 模块时,我遇到了同样的错误。

当我尝试从 (django2.2) 中的另一个应用程序导入我的模型时,我也遇到了这个问题

但最后我导入了它并且它成功地工作了。

这是我的两个应用程序:

INSTALLED_APPS = [
    ...

    'categories',
    'videos',
]

这是我如何将其作为 ForeignKey Connectivity[= 导入 videos/models.py 文件的代码13=]

from django.db import models

class Videos(models.Model):
    categories = models.ForeignKey('categories.Categories', related_name='categories', on_delete=models.CASCADE)

如果想从 categories/models.py 文件中查看我的类别模型,您可以查看此代码,否则忽略它

from django.db import models

class Categories(models.Model): 
    category_name = models.CharField(max_length=50)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

是循环导入

在我的例子中,我需要导入的 class 不是用于关系字段,而是用于在方法中使用它。 如果是这种情况,我建议在方法内部导入,否则会引发 AppRegistryNotReady("Models aren't loaded yet.")。

class Student(CustomUser):
""" Usuario alumno """
class Meta:
    verbose_name = "Alumno"
    verbose_name_plural = "Alumnos"

def get_current_school_class(self):
    """ Obtiene el curso actual de un alumno """
    from school.models import SchoolClass, StudentClass
    # proceed with the method...

不需要从其他应用导入模型 只需将 app.models 放在外键字段中即可;)

应用 1:

class model1(models.Model):
    field=models.field type ...

应用 2:

class model2(models.Model):
    field=models.ForeignKey('app1.model1', on_delete. ...)

避免代码更正:D