如何在不创建 django 项目的情况下使用 Django 1.8.5 ORM?

Posted

技术标签:

【中文标题】如何在不创建 django 项目的情况下使用 Django 1.8.5 ORM?【英文标题】:How to use Django 1.8.5 ORM without creating a django project? 【发布时间】:2016-01-15 04:18:09 【问题描述】:

我已经将 Django ORM 用于我的一个网络应用程序,我对它非常满意。现在我有一个新要求,它需要数据库,但 Django 没有提供其他任何东西。我不想花更多的时间去学习一个像 sqlalchemy 这样的 ORM。

我觉得我还是可以的from django.db import models 并创建模型,但没有manage.py 我将如何进行迁移和同步?

【问题讨论】:

Use Django ORM as standalone的可能重复 同意,问题与“use-django-orm-as-standalone”和“仅使用 Django 的某些部分?”重复。和“using-only-the-db-part-of-django”,但答案适用于旧版本的 django,如果我关闭这个问题,有人需要很长时间才能写出最新版本的答案并将其置顶第一个或第二个答案。 Using django for CLI tool的可能重复 【参考方案1】:

那里有很多适用于旧版本 Django 的答案,但 Django 不断更新,在我的研究中,我发现 Django 1.8/1.9 没有可行的答案,所以我不得不自己推出。以下是你的做法:

项目结构:

├── data
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   └── models.py
├── main.py
├── manage.py
└── settings.py

data 目录和迁移目录包含空的__init__.py 文件。示例models.py 文件内容如下:

# models.py
from django.db import models

class User(models.Model):
    name = models.CharField(max_length=255)
    email = models.EmailField(max_length=255)

manage.py 文件是典型的 Django manage.py 文件。如果您从新的 django-admin startproject 命令复制它,请务必更改 os.environ.setdefault 中的设置参数:

#!/usr/bin/env python
# manage.py
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
    from django.core.management import execute_from_command_line
    execute_from_command_line(sys.argv)

settings.py 文件需要 3 个设置:DATABASES、INSTALLED_APPS 和 SECRET_KEY。有关非 SQLite 的数据库,请参阅 Django 文档:

# settings.py
DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'sqlite.db',
    


INSTALLED_APPS = (
    'data',
    )

SECRET_KEY = 'REPLACE_ME'

真正的诀窍在于main.py,您可以在其中针对您的模型进行编码。显然,您必须使用 wsgi 才能使用这两行代码:

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

这是一个示例 main.py:

# main.py
# Django specific settings
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")

### Have to do this for it to work in 1.9.x!
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
#############

# Your application specific imports
from data.models import *

#Add user
user = User(name="someone", email="someone@example.com")
user.save()

# Application logic
first_user = User.objects.all()[0]

print(first_user.name)
print(first_user.email)

This project 和 this post 是我找到答案的有用起点,我的拉取请求与 Django 1.9 的工作代码已合并,因此您现在可以从 masnun 的存储库中获取代码。如果您知道更好的方法,请提交拉取请求。

【讨论】:

这个答案在最近的 django-version 中非常有效!谢谢:) 这仍然与 1.10.1 相关吗? @mattmc3 它在Django 1.9.7 中对我不起作用,我有这个错误django.core.exceptions.ImproperlyConfigured: COMPRESS_ROOT defaults to STATIC_ROOT, please define either。你知道为什么吗? @trex - 我刚刚在github.com/masnun/django-orm-standalone 克隆了repo,并验证它在Python3 和Django 版本到1.10.2 仍然对我有效。你修改了你的settings.py吗?也许尝试克隆 repo 新鲜。 从 Django 2.0.5 (Python 3.5) 开始,此方法有效,但我收到有关重新加载模型的运行时警告。我的设置的一个更好的解决方案是用django.setup() 替换两个wsgi 行。【参考方案2】:
import os
from django.conf import settings
from django.apps import apps

conf = 
    'INSTALLED_APPS': [
        'Demo'
    ],
    'DATABASES': 
        'default': 
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join('.', 'db.sqlite3'),
        
    


settings.configure(**conf)
apps.populate(settings.INSTALLED_APPS)

在 django 1.11.x 上测试

【讨论】:

这个终于成功了!大多数答案都不起作用,我得到'django.core.exceptions.AppRegistryNotReady:应用程序尚未加载。' 这个答案以及上面的@mattmc3 的答案也适用于 Django 2.1。非常感谢! 这个功能是manage.py文件还是settings.py文件?【参考方案3】:

Django 1.11 documentation on how the applications are loaded

对于最新的 django 版本,项目结构将是-

|--myproject
|--main.py
|--manage.py
|--myapp
|   |--models.py
|   |--views.py
|   |--admin.py
|   |--apps.py
|   |--__init__.py
|   |--migrations
|--myproject
|   |--settings.py
|   |--urls.py
|   |--wsgi.py
|   |--__init__.py

你仍然需要 manage.py 来运行迁移,main.py 是你的独立脚本

# main.py
import os
import django
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
django.setup()
from myapp.models import MyModel
print(MyModel.objects.all()[0])

【讨论】:

【参考方案4】:

这对我有用:

import os
# replace project_name with your own project name
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project_name.settings")
django.setup()
from core.models import Customer,Jobs,Payments

# Your script code

【讨论】:

【参考方案5】:

我必须添加import django,然后这才奏效。

【讨论】:

以上是关于如何在不创建 django 项目的情况下使用 Django 1.8.5 ORM?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在不创建自定义用户的情况下更改 Django 1.5 中的 USERNAME_FIELD 吗?

Django:在不指定主键的情况下创建固定装置?

如何使用 Django、Ajax、jQuery 在不刷新页面的情况下提交表单?

在不重新加载页面的情况下更新 Django 中的表单值?

在 Django 中,您可以在不总是生成迁移的情况下运行种子数据吗?

如何在不使用 Django 模型的情况下使用 MySQL 中的完整数据库