【问题标题】:Use Django ORM outside of Django在 Django 之外使用 Django ORM
【发布时间】:2018-01-17 15:25:33
【问题描述】:

我是 Django 新手,想在我的脚本中使用它的 ORM,而不需要运行整个 Django。我正在摸索如何配置它。在 StackOverflow 上的搜索没有帮助,因为答案没有显示完整的图片。

因此,我创建了一个小项目:

app.py
manage.py
orm/
  __init__.py
  models.py

manage.py 有配置:

from django.conf import settings    
settings.configure(
    DATABASE_ENGINE = 'mysql',
    DATABASE_NAME = 'db',
    DATABASE_USER = 'admin',
    DATABASE_PASSWORD = '',
    DATABASE_HOST = 'localhost',    
    INSTALLED_APPS = ('orm')
)

models.py:

from django.db import models    
class Label(models.Model):
    name = models.CharField(max_length=50) # required max_length

最后是我的主文件 app.py:

from django.conf import settings    
from django.db import models
from orm.models import *   
\# do database maniupaltions

虽然运行 app.py 后我收到一个错误: django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

我做错了什么?

【问题讨论】:

  • django 具有管理命令,您可以将其作为脚本运行,而无需运行 runserver。在这里阅读更多:docs.djangoproject.com/en/1.11/howto/custom-management-commands
  • 使用@VikashSingh 已经提到的自定义命令。另一种选择可能是stackoverflow.com/a/41826771/5616580
  • 您正在manage.py 中配置设置,但您正在运行app.py。如果你要运行app.py,那就是你需要配置它们的地方。在使用 ORM 之前,您还需要致电 django.setup()
  • @knbk django.setup() - 我认为这是我缺少的部分,我让它工作了,谢谢

标签: python django python-2.7 django-models orm


【解决方案1】:

所以你的问题是:

我想在我的脚本中使用 Django 的 ORM 而不运行一个完整的 Django 应用程序,如何配置它?

我将分享我使用 Django 2.0.2 为我目前正在从事的项目所做的工作。

我建议你创建一个文件SetupDjangoORM.pywith :

import django
from django.conf import settings

settings.configure(
    DATABASES={
        'default': {
            'ENGINE': '<your_engine>',
            'NAME': '<database_name>',
            'HOST': '<hostname_or_ip>',
            'PORT': '<port>',
            'USER': '<user>',
            'PASSWORD': '<super_secret_password>',   
        }
    },
    INSTALLED_APPS=[
        '<your_app>',
    ]
)
django.setup()

您可以在settings.py 文件中找到这些信息。

然后,您可以在任何需要的地方导入它:

from . import SetupDjangoORM

现在您可以在脚本中使用 Django 模型 (ORM)。

【讨论】:

  • 我将SetupDjangoORM.py 移动到运行良好的 django 文件夹中,其中包含应用程序并运行脚本。当我尝试拨打from . import SetupDjangoORM 时,我收到错误from . import SetupDjangoORM ValueError: Attempted relative import in non-package
  • 您是否将__init__.py 文件添加到包含SetupDjangoORM.py 的文件夹中?
【解决方案2】:

您可以找到所有信息here

这适用于 Django 3.1 版

import django
from django.conf import settings
from myapp import myapp_defaults

settings.configure(default_settings=myapp_defaults, DEBUG=True)
django.setup()

# Now this script or any imported module can use any part of Django it needs.
from myapp import models

【讨论】:

    【解决方案3】:

    这是一个更新版本,修复包括django.setup() 行和一些额外的设置,包括:

    manage.py

    import os
    import sys
    import django
    from django.conf import settings
    
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    
    INSTALLED_APPS = [
        'orm',
    ]
    
    DATABASES = {
        'default': {
            'ENGINE' : 'django.db.backends.mysql',
            'NAME' : 'playground',
            'USER' : 'admin',
            'PASSWORD' : 'pasw',
            'HOST' : 'localhost',
        }
    }
    
    settings.configure(
        INSTALLED_APPS = INSTALLED_APPS,
        DATABASES = DATABASES,
    )
    
    django.setup()
    
    if __name__ == "__main__":
        from django.core.management import execute_from_command_line
    
        execute_from_command_line(sys.argv)
    

    还有 app.py:

    import manage
    from orm.models import Label
    
    if __name__ == '__main__':
    
        Label.objects.create(name='test')
        print(Label.objects.get(name='test'))
    

    希望有人会觉得它有用。

    【讨论】:

      猜你喜欢
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      • 2023-03-04
      • 2011-01-11
      • 2016-03-21
      相关资源
      最近更新 更多