如何使应用程序模型可用于 django 项目中的其他应用程序?

Posted

技术标签:

【中文标题】如何使应用程序模型可用于 django 项目中的其他应用程序?【英文标题】:How to make models of app available to other apps in a django project? 【发布时间】:2020-05-10 17:44:16 【问题描述】:

创建一个基于 Django 3 的全栈项目似乎是最佳实践(或至少一种常用方法),该项目使用具有此类结构的项目特定 Django 应用程序(而不是独立的 Django 应用程序)(请参阅例如 @987654321 @):

fullstack_project/
  frontend/
    ... # frontend stuff goes into here
  backend/  # Django project name
    apps/
      app1/
        apps.py
        logic.py
        models.py
        ...
      app2/
        apps.py
        logic.py
        models.py
      ...
    wsgi.py
    ...
  manage.py

应用程序(此处:app1)通过fullstack_project/backend/apps/app1/apps.py以最基本的形式(没有规则、视图等)集成

class App1Config(AppConfig):
    name = 'backend.apps.app1'

fullstack_project/backend/settings.py

INSTALLED_APPS = [
    ...
    'backend.apps.app1.apps.App1Config',
    'backend.apps.app2.apps.App2Config',
]

在另一个应用程序(例如app1/logic.py)中使用一个应用程序的逻辑(例如app2/logic.py)可以正常工作(例如通过app1/logic.py中的from backend.apps.app2.logic import ...)。

但是,如果我尝试在 app2 的逻辑中访问 app1 的模型,我会得到 django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.。我可以为应用程序实现数据库包装器以允许跨应用程序数据库访问。但是无论如何,这些应用程序都是跨项目的,我想避免这种情况并更轻松地允许访问。我该如何解决这个问题?

【问题讨论】:

您是否在设置的已安装应用程序中添加了这两个应用程序 是的。我改进了这个问题。 您是否在 __init__.py 的应用程序中执行任何功能,如果有,请评论和检查 @PavanKumarTS 是的,我错过了删除其中一个应用程序的__init__.py 中的调试代码。如果您提供您的评论作为答案,我会接受它。谢谢! 【参考方案1】:

__init__.py 中可能会有一些代码在应用注册并准备好之前尝试访问数据库。因此,如果您在__init__.py 中有任何代码,请对其进行评论或确保一旦应用程序准备好它就会访问数据库。

【讨论】:

删除 init.py 中的代码是解决方案。但是代码没有访问数据库(包含代码的应用程序 init.py 根本没有模型)。

以上是关于如何使应用程序模型可用于 django 项目中的其他应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据库中的 Django 模型实例“腌制”到可用于加载示例数据的示例 python 代码中?

对如何使 Django 模型字段可选的感到困惑

Django用户模型电子邮件字段:如何使其成为强制性

如何使通过多对多关系连接的模型在 Django admin 中同时在两个地方可编辑?

如何使安装了 CocoaPods 的 pod 可用于我工作区中的所有项目?

如何使 django 中的 FileField 成为可选的?