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

swa*_*ala 20 python django orm

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

我想我仍然可以
from django.db import models
创建并创建模型,但是manage.py如何不进行迁移和同步?

mat*_*mc3 28

有很多答案适用于旧版本的Django,但Django不断更新,在我的研究中我发现Django 1.8/1.9没有可行的答案,所以我不得不自己动手.这是你如何做到的:

项目结构:

??? data
?   ??? __init__.py
?   ??? migrations
?   ?   ??? __init__.py
?   ??? models.py
??? main.py
??? manage.py
??? settings.py
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

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

#!/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)
Run Code Online (Sandbox Code Playgroud)

settings.py文件需要3个设置:DATABASES,INSTALLED_APPS和SECRET_KEY.请参阅不是SQLite的DB的Django文档:

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

INSTALLED_APPS = (
    'data',
    )

SECRET_KEY = 'REPLACE_ME'
Run Code Online (Sandbox Code Playgroud)

真正的诀窍在于main.py,您可以根据模型进行编码.显然你必须使用wsgi这两行来解决问题:

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
Run Code Online (Sandbox Code Playgroud)

这是一个示例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)
Run Code Online (Sandbox Code Playgroud)

这个项目以及这篇文章是我找到答案的有用起点,我的Django 1.9工作代码的pull请求已经合并,所以你现在可以从masnun的repo中获取代码.如果您知道更好的方法,请提交拉取请求.

  • 从Django 2.0.5(Python 3.5)开始,此方法有效,但是我收到有关重新加载模型的运行时警告。对于我的设置,更好的解决方案是用django.setup()替换两条wsgi行。 (3认同)

小智 8

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)
Run Code Online (Sandbox Code Playgroud)

测试django 1.11.x.


swa*_*ala 5

有关如何加载应用程序的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
Run Code Online (Sandbox Code Playgroud)

您仍然需要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])
Run Code Online (Sandbox Code Playgroud)