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

tez616oj  于 2022-12-01  发布在  Go
关注(0)|答案(5)|浏览(132)

我已经用Django ORM做了我的一个web应用,我对它非常满意。现在我有了一个新的需求,需要数据库,但Django没有提供其他东西。我不想花更多的时间去学习另一个ORM,比如SQLAlchemy。
我想我还是可以做的:

from django.db import models

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

wn9m85ua

wn9m85ua1#

有很多解决方案都适用于旧版本的Django,但Django在不断更新,在我的研究中,我没有找到适用于Django 1.8/1.9的可行解决方案,所以我不得不推出自己的解决方案。
项目结构:

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

data目录和migrations目录包含空的__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个设置:数据库,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 projectthis post是我找到答案的有用起点,我的pull请求和Django 1.9的工作代码被合并了,所以你现在可以从masnun的repo中获取代码了。如果你知道更好的方法,请提交一个pull请求。

mnowg1ta

mnowg1ta2#

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])
hof1towb

hof1towb3#

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上的测试

ssm49v7z

ssm49v7z4#

这对我很有效:

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
ssm49v7z

ssm49v7z5#

我不得不加上import django,然后这个就起作用了。

相关问题