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

29

我曾经在一个Web应用中使用过Django ORM,对其非常熟悉。现在我有一个新的需求,需要使用数据库,但不需要Django提供的其他功能。我不想再花时间学习像SQLAlchemy这样的另一个ORM。

我认为我仍然可以做到:

from django.db import models

我想创建模型,但是没有manage.py,我该如何进行迁移和同步操作呢?


2
可能是使用Django ORM作为独立工具的重复问题。 - user1797792
3
同意,该问题是“使用Django ORM作为独立工具”、“仅使用Django的某些部分?”和“仅使用Django的数据库部分”的重复问题,但回答适用于较旧版本的Django。如果我关闭此问题,要有人编写最新版本的答案并将其排在第1或第2个答案位置需要很长时间。 - swapnil jariwala
可能是使用Django开发CLI工具的重复问题。 - e4c5
5个回答

35

有很多答案适用于旧版本的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文件需要三个设置: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)

这个项目以及这篇文章对我查找答案非常有帮助。我的有关Django 1.9的工作代码被合并了,因此您现在可以从masnun的存储库中获取代码。如果您知道更好的方法,请提交一个拉取请求。


1
这个答案在最近的 Django 版本中完美地工作了!谢谢 :) - user3595632
1
这个对于1.10.1版本还适用吗? - waspinator
@mattmc3 在我的Django 1.9.7中无法工作,我遇到了这个错误 django.core.exceptions.ImproperlyConfigured: COMPRESS_ROOT defaults to STATIC_ROOT, please define either。你知道为什么吗? - srgbnd
1
@trex - 我刚刚克隆了 https://github.com/masnun/django-orm-standalone 仓库,并验证了它在 Python3 和 Django 版本通过 1.10.2 上仍然可以正常工作。你修改了你的 settings.py 吗?也许尝试重新克隆仓库。 - mattmc3
3
从Django 2.0.5(Python 3.5)开始,该方法有效,但我会收到有关重新加载模型的运行时警告。对于我的设置,更好的解决方案是用django.setup()替换两个wsgi行。 - Austin A
https://github.com/dancaron/Django-ORM 可与 3.x.x 版本一起使用。 - vrnvorona

12

Django 1.11 关于应用程序如何加载的文档

最新版本的 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])

11
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 上进行测试


1
终于成功了!大多数答案对我都不起作用,我一直收到“django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.”的错误提示。 - Sanjaya Wijeratne
1
这个回答和上面@mattmc3的回答也适用于Django 2.1。非常感谢! - Anshul
1
这个函数应该放在 manage.py 文件还是 settings.py 文件中? - moshevi

2
这对我有用:

这对我有用:

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

-1

我不得不添加import django,然后这个就可以工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接