如何在 django 3.0 的 __init__.py 中从 base.py 导入类。似乎在应用注册时无法设置 self.apps_ready

Posted

技术标签:

【中文标题】如何在 django 3.0 的 __init__.py 中从 base.py 导入类。似乎在应用注册时无法设置 self.apps_ready【英文标题】:How can I import class from base.py in __init__.py in django 3.0. It seems it isn't able to set self.apps_ready while app registry 【发布时间】:2020-04-29 01:37:24 【问题描述】:

Django 版本 - 3.0

BaseModel - base_models/models.py

# Create your models here.

from django.db import models


class BaseModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateField(auto_now=True)

base_models/__init__.py

from base_models.models import BaseModel

settings.py

INSTALLED_APPS = [
     ...,
     'base_models.apps.BaseModelsConfig',
     ...
]

错误 -

文件“/Users/vaibhavsharma/vaibhav/workspace/rm-api/rm-api/base_models/__init__.py”,第 1 行,在 从 base_models.models 导入 BaseModel 文件“/Users/vaibhavsharma/vaibhav/workspace/rm-api/rm-api/base_models/models.py”,第 6 行,在 类 BaseModel(models.Model): new 中的文件“/Users/vaibhavsharma/vaibhav/workspace/rm-api/env/lib/python3.7/site-packages/django/db/models/base.py”,第 107 行 app_config = apps.get_ contains_app_config(模块) 文件“/Users/vaibhavsharma/vaibhav/workspace/rm-api/env/lib/python3.7/site-packages/django/apps/registry.py”,第 252 行,在 get_ contains_app_config self.check_apps_ready() 文件“/Users/vaibhavsharma/vaibhav/workspace/rm-api/env/lib/python3.7/site-packages/django/apps/registry.py”,第 135 行,在 check_apps_ready raise AppRegistryNotReady("应用尚未加载。") django.core.exceptions.AppRegistryNotReady:应用程序尚未加载。

【问题讨论】:

没错,应该在app配置的ready方法中导入。为什么要在__init__.py 中导入这个? 嘿@WillemVanOnsem,谢谢,是的,它工作正常,但我正在考虑使用类似from base_models import BaseClass? 的东西有没有办法实现它? 【参考方案1】:

我找到了答案,你不能在 Django 3.0 中做到这一点。似乎在这个版本中,每个应用程序初始化 self.check_apps_ready() 函数都从 apps/registry.py 运行,该函数本身从 app/settings.py 的 INSTALLED_APPS 进行检查。

这就是我使用 BaseModel 的方式。

    python manage.py startapp base. 从 base 应用中删除了 models.py 文件 在同一应用中创建了 models 目录。 在 base/models/ 中创建了 __init__.py 文件。 在 base.py 中初始化了我的模型。 在 init.py(base/models/__init__.py) 中包含 BaseModel from .base import BaseModel 最后在base/__init__.py 中包含from .models import BaseModel from base import BaseModel 在应用中的任何位置包含 BaseModel。

完成!

参考 - https://docs.djangoproject.com/en/3.0/topics/db/models/#organizing-models-in-a-package

【讨论】:

以上是关于如何在 django 3.0 的 __init__.py 中从 base.py 导入类。似乎在应用注册时无法设置 self.apps_ready的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 之外使用 Django 模型?

如何从视图将值传递给 Django Form init 方法?

如何在自定义 django 表单中隐藏 django 标签?

如何在 django 中为选项标签添加属性?

如何在 django 中为选项标签添加属性?

TypeError: __init__() 在 Django Form & Formset 中有一个意外的关键字参数