Django 2.0访问模型(CREATE/REMOVE/FILTER)独立[无管理.py壳牌公司]

2024-04-26 04:58:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django项目,我想生成一些对象(从模型中)

我想要的是:独立的Python脚本创建一堆对象和/或过滤、删除。在

使用from apps.base.models import MyModel导入模型后 按照前面的StackOverflow问题提示我无法运行脚本来设置配置。在

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")
import django

django.setup()
from apps.base.models import MyModel

请注意,这是在Django 2.0.6版上的。在

使用了正确的设置,(myProject.settings

  • 在正确配置了其他所有内容后,我得到以下错误:

    • RuntimeError: Model class apps.base.models.MyModel doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

设置:

{git的完整链接^在这里}


Tags: apps对象djangofrom模型import脚本an
3条回答

我在目前的项目结构中看到两个问题。在

缺少AppConfig

正如另一个正确的答案所建议的那样,您需要提供一个AppConfig子类来注册您的应用程序;请参见Django文档中的Configuring applications部分。在

但是,为名称空间声明使用apps包是完全可以的,特别是如果您计划有多个应用程序;实际上,this is what Django does itself将所有电池应用程序捆绑在django.contrib命名空间下。在我的工作中,我们还使用公共名称空间来组织Django应用程序:mycompany.internal.someappmycompany.customers.otherapp等等

所以你不需要移动文件。只要正确引用apps.base:创建一个文件apps/base/apps.py,其内容如下:

# apps/base/apps.py
from django.apps import AppConfig


class MyBaseAppConfig(AppConfig):
    name = 'apps.base'

现在在设置中引用应用程序apps.base的已创建配置类:

^{pr2}$

如果apps应该是一个包,则将其视为一个

所以您声明了apps包(通过在apps目录中放置一个__init__.py文件)。但是,您永远不会使用该包,而是通过向其添加apps目录来修改sys.path。{{cd7>行下的{cd7>应该是

# remove this line:
path.append(os.path.join(PROJECT_ROOT, "apps"))

并在整个应用程序中使用正确的导入,替换:

  • from .modelsfrom apps.base.models
  • from .formsfrom apps.base.forms
  • from .pregledViewfrom apps.base.pregledView
  • from .postsViewfrom apps.base.postsView

另外,别忘了更换

urlpatterns = [
    url(r'', include('base.urls')),
    ...
]

urlpatterns = [
    url(r'', include('apps.base.urls')),
    ...
]

DzenanElvir/urls.py你应该可以走了。在

我再次git clone完成了Django项目的repository并通过执行以下操作使其正常工作,而不必修改项目的结构:


1。重新编写settings.BASE_DIR变量

通常,Django项目的设置文件的文件路径是projectname/settings.py,但是对于分开的设置,它是projectname/settings/<env_name>.py。在

因此,BASE_DIR需要从以下位置进行返工:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

收件人:

^{pr2}$

以说明项目根目录和设置文件之间的额外目录。在


2。更改INSTALLED_APPS中的应用程序声明:

你的应用程序从BASE_DIR开始的虚线位置是apps.base。将当前声明base替换为apps.base。在


3。固定虚线路径:

如果虚线路径导致任何错误,请检查回溯,因为它将指向问题。例如,当前的urls.py很可能会导致问题,因为有一个指向base.urls的虚线路径,而它应该是显式的apps.base.urls。例如:

urlpatterns = [
    url(r'', include('base.urls')),
    ...
]

至以下地址:

urlpatterns = [
    url(r'', include('apps.base.urls')),
    ...
]

4。迁移模型

执行./manage.py makemigrations && ./manage.py migrate。在

另外,作为补充说明,migrations目录不应该在.gitignore中。阅读:Should I be adding the Django migration files in the .gitignore file?



这样,我就可以在Django项目的根目录下运行以下脚本,而不会出错:

import os
import django

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DzenanElvir.settings.base")
django.setup()
from apps.base.models import ModelRazred

git clone设计了你的Django项目的repository,并让它开始工作,执行以下操作:


1。将项目的应用程序移动到项目的根目录

这是一个常见的Django标准。我所做的是./manage.py startapp base重新开始,然后将apps/base目录中的所有文件/目录添加到刚刚创建的base目录中。在项目的根目录中应该如下所示(其中DzenanElvir&;base是目录):

(.env) Cole:StackOverflow/Razred-Management ‹master*›$ ls -l              
total 512
drwxr-xr-x   9 Cole  staff     288 Jul  2 23:50 DzenanElvir
-rw-r r    1 Cole  staff    1055 Jul  2 23:48 LICENSE
-rw-r r    1 Cole  staff     299 Jul  2 23:48 Pipfile
-rw-r r    1 Cole  staff   27343 Jul  2 23:48 Pipfile.lock
-rw-r r    1 Cole  staff      72 Jul  2 23:48 Procfile
-rw-r r    1 Cole  staff    1160 Jul  2 23:48 README.md
drwxr-xr-x  15 Cole  staff     480 Jul  3 00:06 base
...

在你新的base应用程序目录中:

^{pr2}$

2。将base应用程序添加到INSTALLED_APPS中,以更明确的方式

注意新的base/apps.py文件,我们将使用它的基于AppConfig的类来声明它是一个已安装的应用程序。将INSTALLED_APPS'base'声明替换为'base.apps.BaseConfig'。在


3。重新编写settings.BASE_DIR变量

通常,Django项目的设置文件的文件路径是projectname/settings.py,但是对于分开的设置,它是projectname/settings/<env_name>.py。在

因此,BASE_DIR需要从以下位置进行返工:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

收件人:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

以说明项目根目录和设置文件之间的额外目录。在


4。迁移模型

执行./manage.py makemigrations && ./manage.py migrate。在

另外,作为补充说明,migrations目录不应该在.gitignore中。阅读:Should I be adding the Django migration files in the .gitignore file?



这样,我就可以在Django项目的根目录下运行以下脚本,而不会出错:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DzenanElvir.settings.base")
import django

django.setup()
from base.models import ModelRazred

相关问题 更多 >