【问题标题】:Using Django database layer outside of Django?在 Django 之外使用 Django 数据库层?
【发布时间】:2011-01-11 22:22:04
【问题描述】:

我在 Django 中创建了一个不错的数据库,我想通过我的网站内容外部的一些 python 脚本进行交互,所以我很好奇这是否可能在 Django 站点之外使用 Django 数据库 API,如果是这样,是否有人知道如何做到这一点?谷歌并没有为此产生很多成功。

【问题讨论】:

    标签: python mysql django


    【解决方案1】:

    对于 django 3+:

    #########################

    目录和文件结构:

    --我的项目

    ----my_project > settings.py

    ----我的应用程序

    ##########################

    import sys
    sys.path.append("C:/Users/khder/Desktop/test/my_project") #append your main project directory path
    
    import os
    import django
    
    #define your setting file as the following.
    os.environ.setdefault(
        'DJANGO_SETTINGS_MODULE', 'my_project.settings'
    )
    django.setup()
    
    from my_app.models import MyModel
    qs = MyModel.objects.all()
    print(qs)
    

    我希望这会有所帮助。 完成。

    【讨论】:

      【解决方案2】:

      在 Django >= V.3.2.3 在模型导入之前放置以下内容

      import os
      import django
      
      os.environ.setdefault(
          'DJANGO_SETTINGS_MODULE', 'mymodule.settings'
      )
      django.setup()
      from app.models import MyModel
      

      然后像往常一样使用你的模型。

      myitem = MyModel()
      myitem.data = 'some data'
      myitem.save()
      

      问候

      【讨论】:

        【解决方案3】:

        我一直在寻找 django 3.0 的答案,但上述方法都不适合我。

        我在https://docs.djangoproject.com/en/3.0/topics/settings/ 阅读了官方文档,这个脚本对我有用。

        我的脚本 db_tasks.py 像这样在 mysite 中。

        mysite
            mysite
            db.sqlite3
            db_tasks.py
            manage.py
            polls
        

        db_tasks.py

        import os
        import django
        
        os.environ['DJANGO_SETTINGS_MODULE'] = 'dashboard.settings'
        django.setup()
        
        from polls.models import Question
        
        print(Question.objects.all())
        out: <QuerySet [<Question: WTU?]>
        

        【讨论】:

        • 这个帮助了我。但我认为作者的环境设置有错误的值:而不是'dashboard.settings',它应该是'mysite.settings'
        • 我的项目名称是dashboard。您可以选择您的项目名称。
        【解决方案4】:

        这是我使用的代码。只需将 your_project 替换为您的 Django 项目名称,将 yourApp 替换为您的 Django 应用程序名称,将 any_model 替换为您要在模型文件中使用的模型,将 any_fild 替换为您要从数据库中获取的字段:

        from django.conf import settings
        import django
        
        from your_project.settings import DATABASES, INSTALLED_APPS
        settings.configure(DATABASES=DATABASES, INSTALLED_APPS=INSTALLED_APPS)
        django.setup()
        
        from yourApp.models import *
        print(any_model.objects.all()[0].any_fild)
        

        【讨论】:

        • 只需将“your_project”替换为您的 django 项目名称,将“yourApp”替换为您的 django 应用程序名称,将“any_model”替换为您要在模型文件中使用的模型,将“any_fild”替换为您想要获取的字段来自数据库
        【解决方案5】:

        根据Hai Hu 的回答,这是一个工作脚本,在 Django 1.10 和 1.11 上进行了测试。 我首先导入 Django 的基础应用程序,因为许多其他应用程序都需要它们。

        import os
        from django.conf import settings
        from django.apps import apps
        
        conf = {
            'INSTALLED_APPS': [
                'django.contrib.admin',
                'django.contrib.auth',
                'django.contrib.contenttypes',
                'django.contrib.messages',
                'django.contrib.sessions',
                'django.contrib.sitemaps',
                'django.contrib.sites',
                'django.contrib.staticfiles',
                '<your_app>',
            ],
            'DATABASES': {
                'default': {
                    'ENGINE': os.environ.get('DB_ENGINE'),
                    'NAME': os.environ.get('DB_NAME'),
                    'USER': os.environ.get('DB_USER'),
                    'PASSWORD': os.environ.get('DB_PASSWORD'),
                    'HOST': os.environ.get('DB_HOST'),
                    'PORT': os.environ.get('DB_PORT'),
                }
            },
            'TIME_ZONE': 'UTC'
        }
        
        settings.configure(**conf)
        apps.populate(settings.INSTALLED_APPS)
        
        <import your app models here>
        

        【讨论】:

        • 您的解决方案有效。注意:您将在其中粘贴此代码的 python 文件应与项目的其他应用程序并排。否则它会出现一堆错误。
        【解决方案6】:
        import os, sys
        
        BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project_name.settings")
        sys.path.append(os.path.abspath(os.path.join(BASE_DIR, os.pardir)))
        
        from django.core.wsgi import get_wsgi_application
        application = get_wsgi_application()
        
        from app.models import MyModel
        

        【讨论】:

          【解决方案7】:

          最后一个没有人提到的选项:custom ./manage.py subcommand

          【讨论】:

          【解决方案8】:

          对于 django 1.7,我使用以下内容启动并运行。

          settings.py:

          from django.conf import settings
          settings.configure(
              DATABASES={
                  'default': {
                      'ENGINE': 'django.db.backends.postgresql_psycopg2',
                      'NAME': 'name',
                      'USER': 'usr',
                      'PASSWORD': 'secret',
                      'HOST': '127.0.0.1',
                      'PORT': '5432',
                  },
              },
              TIME_ZONE='America/Montreal',
          )
          

          在包含启动例程的文件中

          import os
          import django
          
          import v10consolidator.settings
          from myapp.models import *
          
          os.environ.setdefault(
              "DJANGO_SETTINGS_MODULE",
              "myapp.settings"
          )
          django.setup()
          

          【讨论】:

            【解决方案9】:

            对于 django 1.5 on(支持多个数据库),DATABASE 设置也发生了变化。 您需要将先前的答案调整为...

            settings.configure(
                DATABASES = { 'default': {
                    'ENGINE': 'django.db.backends.postgresql_psycopg2',
                    'NAME': 'db_name',
                    'USER': 'db_usr',
                    'PASSWORD': 'db_pass',
                    'HOST': '',
                    'PORT': '',
                    }, },
                TIME_ZONE = 'Europe/Luxembourg'
            )
            

            【讨论】:

              【解决方案10】:

              更新 setup_environ 将在 django 1.6 中移除

              如果你能够导入你的 settings.py 文件,那么take a look 就在方便的 setup_environ 命令中。

              from django.core.management import setup_environ
              from mysite import settings
              
              setup_environ(settings)
              
              #here you can do everything you could in your project
              

              【讨论】:

              【解决方案11】:

              从您需要的其他应用程序中使用 Django ORM:

              1) export DJANGO_SETTINGS_MODULE=dproj.settings

              2) 将你的 Django 应用文件夹添加到路径中(你可以在你的非 django-app 的代码中做到这一点):

              sys.path = sys.path + ['/path/to/your/app/']
              

              3) 如果使用 SQLite,请使用 settings.py 中 db 文件的完整路径:

              DATABASE_NAME = '/path/to/your/app/base.db'
              

              【讨论】:

              • 作为正确设置环境变量的另一种方法,您可以在导入应用程序模块之前将 os.environ['DJANGO_SETTINGS_MODULE']=dproj.settings 放在顶部。这只会在该过程期间更改 DJANGO_SETTINGS_MODULE。
              • 这是一个非常好的方法,而不是重复设置而不是接受的答案。此外,如果 Django 设置已经包含 SQLite 文件的绝对路径,这是 当前 Django 版本的情况,则 不再需要步骤 3。使其成为最紧凑的解决方案。
              【解决方案12】:

              您只需要在进行任何调用之前配置 Django 设置,包括导入模型。像这样的:

              from django.conf import settings
              settings.configure(
                  DATABASE_ENGINE = 'postgresql_psycopg2',
                  DATABASE_NAME = 'db_name',
                  DATABASE_USER = 'db_user',
                  DATABASE_PASSWORD = 'db_pass',
                  DATABASE_HOST = 'localhost',
                  DATABASE_PORT = '5432',
                  TIME_ZONE = 'America/New_York',
              )
              

              同样,请确保在运行之前运行该代码,例如:

              from your_app.models import *
              

              然后照常使用 DB API。

              【讨论】:

              • 我有一个连接器(包)来连接到 Hive 数据库,我可以将它导入 python 程序并从 Hive 数据库中获取数据。我应该把那个连接器放在哪里,即,我应该放在哪个文件夹中,我应该给我的 DATABASE_ENGINE 取什么名字?提前致谢。
              • 我们需要将哪些库添加到 requirements.txt 才能得到这个?
              • 我遇到了我在这里记录的错误stackoverflow.com/questions/49015994/…
              • 只导入项目中已经存在的settings.py 还不够吗?
              猜你喜欢
              • 1970-01-01
              • 2018-01-17
              • 2016-02-20
              • 2019-10-12
              • 1970-01-01
              • 2023-03-04
              • 2016-03-21
              • 2016-08-03
              • 1970-01-01
              相关资源
              最近更新 更多