2015-10-16 7 views
9

Ho usato Django ORM per una delle mie app Web e mi sento molto a mio agio. Ora ho un nuovo requisito che richiede un database ma nient'altro che Django offre. Non voglio investire più tempo nell'apprendimento di un altro ORM come sqlalchemy.Come utilizzare Django 1.8.5 ORM senza creare un progetto django?

credo di poter ancora fare
from django.db import models
e creare modelli, ma poi senza manage.py come farei la migrazione e la sincronizzazione?

+2

Possibile duplicato di [Utilizzare Django ORM come standalone] (http://stackoverflow.com/questions/937742/use-django-orm-as-standalone) – user1797792

+2

Accetto, la domanda è duplicata di "use-django-orm-as -standalone "e" Usa solo alcune parti di Django?"e" using-only-the-db-part-of-django "ma le risposte sono per le versioni precedenti di django, se chiudo questa domanda, ci vorranno anni affinchè qualcuno scriva la risposta per l'ultima versione e per farlo prima o seconda risposta –

+0

Possibile duplicato di [Uso di django per lo strumento CLI] (http://stackoverflow.com/questions/32088702/using-django-for-cli-tool) – e4c5

risposta

18

Ci sono un sacco di risposte là fuori che funzionano con le versioni precedenti di Django, ma Django è in costante aggiornamento e nella mia ricerca non ho trovato risposte valide per Django 1.8/1.9, quindi ho dovuto girare il mio. Ecco come si fa:

Progetto Struttura:

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

La directory data directory e migrazioni contengono vuoti __init__.py file. Il file di esempio models.py legge come segue:

from django.db import models 

class User(models.Model): 
    name = models.CharField(max_length=255) 
    email = models.EmailField(max_length=255) 

Il file manage.py è il tipico file di Django manage.py. Basta essere sicuri di modificare il parametro impostazioni os.environ.setdefault se si copia da un comando fresco 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) 

Il file settings.py richiede 3 impostazioni: Data Base, INSTALLED_APPS e SECRET_KEY. Fare riferimento alla documentazione Django per DB che non sono SQLite:

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

INSTALLED_APPS = (
    'data', 
    ) 

SECRET_KEY = 'REPLACE_ME' 

Il vero trucco sta nel main.py, che sarà in cui è possibile codificare contro i tuoi modelli. A quanto pare è necessario utilizzare wsgi per ottenere le cose a lavorare con queste due righe:

from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application() 

Ecco un main.py campione:

# 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) 

This project insieme this post erano punti di partenza utile per me per trovare la risposta e la mia richiesta di pull con codice di lavoro per Django 1.9 è stata unita, quindi ora puoi prendere il codice dal repository di masnun. Se conosci un modo migliore, invia una richiesta di pull.

+1

Questa risposta è perfettamente funzionante in recenti django- Grazie :) – user3595632

+0

funziona come un incantesimo! – Chriz

+1

è ancora valido per 1.10.1? – waspinator

1

Django 1.11 documentation on how the applications are loaded

Per ultima struttura versione Django progetto sarebbe essere-

|--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 

si sarebbe ancora bisogno di manage.py per eseguire le migrazioni, main.py è lo script standalone

# 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]) 
5
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) 

Test su django 1.11.x

+1

Finalmente questo ha funzionato! La maggior parte delle risposte non ha funzionato e stavo ricevendo "django.core.exceptions.AppRegistryNotReady: le app non sono ancora state caricate". –