Django设置:与独立模块共享ORM

问题描述 投票:0回答:1

简介:在使用PyCharm和Python 3.8和Postgresql开发我的第一个项目时,我正在学习Django。我的设置有问题。

环境描述:

我的目标是要有一个用于网站的Django项目连接到数据库(我们称它为“ web_db”),该项目定期接收来自外部源(另一个数据库的数据)的数据“ source_db”)。

对于从一个数据库到另一个数据库的ETL过程,我正在开发一个名为“ source2web”的Python模块。我使用psycopg2阅读了source_db的内容。我正在开发一个PyCharm项目中的所有内容。

现在,由于我将使用Django ORM从Django应用程序服务器访问web_db的内容,因此得出结论,我也可以在source2web中使用Django ORM将内容加载到web_db 。这意味着我正在尝试在Django项目和source2web之间共享一些代码:Django的ORM模型。source2web只是作为python模块(python source2web.py)启动。

在我的PyCharm项目中,我有一个src文件夹,里面是我的所有python模块,带有像这样的树(文件夹带有括号表示):

(src)
  |--(project_name)
         |--(module1)
         |      |--source2web.py
         |
         |--(django)
              |--(django_project)
                          |--(django_project)
                          |--(another_app)  

[文件夹django_project/django_projectdjango_project/another_app由Django使用命令django-admin startproject django_projectpython3 manage.py startapp another_app经典创建。

我要共享的ORM模型是文件django_project/another_app/models.py中的模型类

问题:我很想找到一种方法来使用source2web中的Django ORM模型。我以为自己有:在source2web的代码中,我添加了以下几行:

os.environ['DJANGO_SETTINGS_MODULE'] = 'project_name.django.django_project.django_project.settings'
import django
django.setup()

但是,我意识到Django服务器和独立模块source2web都可以工作,但不能在project_name.django.django_project.django_project.settings.py中使用完全相同的内容:INSTALLED_APPS列表中的another_app名称必须不同。

  • Django要求该应用仅列为another_app
  • source2web要求该应用程序被列为project_name.django.django_project.another_app

我确信我可以找到一种“肮脏的方式”来解决这个问题,但我也认为我不是第一个遇到此问题的人(在Django项目和独立程序之间共享Django ORM代码),希望更清洁的方式来管理此。

我能想到的是复制模块project_name.django.django_project.django_project.settings,然后仅更改source2web(os.environ['DJANGO_SETTINGS_MODULE'] = ...)内的设置调用,但我从不喜欢复制代码,也许有比这更干净的东西了]

python django pycharm django-orm
1个回答
0
投票

我发现至少一个体面的解决方法:

  • project_name.django.django_project.django_project.settings文件中,我保留了可与Django一起使用的INSTALLED_APPS的值,即,由Django Project加another_app创建的默认应用程序的列表。
  • 然后在[[source2web模块中,将我的导入块更改为::>的行将project_name.django.django_project.django_project.settings导入为djangosettingsdjangosettings.INSTALLED_APPS = ['project_name.django.django_project.another_app',]os.environ ['DJANGO_SETTINGS_MODULE'] ='project_name.django.django_project.django_project.settings'进口djangodjango.setup()

  • 这样,我保留了Django服务器的设置,只覆盖了[[source2web

模块中的必要内容(即INSTALLED_APPS的值,同时删除了我没有使用的所有默认应用程序)需要我的ETL流程)。它可以工作,而且看起来足够健壮。

仍然,这使我开始质疑整个项目的结构:

因为显然,整个问题是PyCharm项目考虑源根src/的结果,而Django项目考虑根project_name/django/django_project/的结果。应该有一种和解的方法。
© www.soinside.com 2019 - 2024. All rights reserved.