如何在 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 Form init 方法?