我曾经在一个Web应用中使用过Django ORM,对其非常熟悉。现在我有一个新的需求,需要使用数据库,但不需要Django提供的其他功能。我不想再花时间学习像SQLAlchemy这样的另一个ORM。
我认为我仍然可以做到:
from django.db import models
我想创建模型,但是没有manage.py
,我该如何进行迁移和同步操作呢?
我曾经在一个Web应用中使用过Django ORM,对其非常熟悉。现在我有一个新的需求,需要使用数据库,但不需要Django提供的其他功能。我不想再花时间学习像SQLAlchemy这样的另一个ORM。
我认为我仍然可以做到:
from django.db import models
我想创建模型,但是没有manage.py
,我该如何进行迁移和同步操作呢?
有很多答案适用于旧版本的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的存储库中获取代码。如果您知道更好的方法,请提交一个拉取请求。
Django 1.9.7
中无法工作,我遇到了这个错误 django.core.exceptions.ImproperlyConfigured: COMPRESS_ROOT defaults to STATIC_ROOT, please define either
。你知道为什么吗? - srgbnddjango.setup()
替换两个wsgi
行。 - Austin A最新版本的 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])
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 上进行测试
这对我有用:
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
我不得不添加import django
,然后这个就可以工作了。