Как использовать Django 1.8.5 ORM без создания проекта django?

Я использовал Django ORM для одного из своих веб-приложений, и мне очень нравится. Теперь у меня есть новое требование, которое нуждается в базе данных, но ничего другого, что предлагает Django. Я не хочу вкладывать больше времени в изучение еще одного ORM, такого как sqlalchemy.

Думаю, я все еще могу сделать from django.db import models
и создавать модели, но затем без manage.py как я могу выполнить миграцию и синхронизацию?

Ответ 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 читается следующим образом:

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. Просто не забудьте изменить параметр параметров в os.environ.setdefault, если вы скопируете его из новой команды django-admin startproject:

#!/usr/bin/env python
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. Обратитесь к документам Django для DB, которые не являются SQLite:

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:

# 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="[email protected]")
user.save()

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

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

Этот проект вместе с этим сообщением были полезными отправными точками для меня, чтобы найти ответ, и мой pull-запрос с рабочим кодом для Django 1.9 был объединен, поэтому теперь вы можете захватить код из masnun repo. Если вы знаете лучший способ, отправьте запрос на растяжение.

Ответ 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

Ответ 3

Документация 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 - это ваш автономный script

# 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