2011-11-08 13 views
46

Sto scrivendo uno script per importare alcuni oggetti del modello nel database utilizzato dall'applicazione django. In passato ho risolto questo problema eseguendo ./manage.py shell e poi import myscript. Sono sicuro che c'è un modo migliore. Mi piacerebbe essere in grado di chiamare uno script da qualsiasi punto del mio HD usando python scriptname.py, e nelle prime righe di quello script farebbe qualsiasi importazione/altra operazione necessaria in modo che possa accedere agli oggetti del modello e comportarsi come se fosse correre usando manage.py shell.Script Django per accedere agli oggetti del modello senza utilizzare la shell manage.py

Cosa devo aggiungere al mio script per ottenere questo risultato?

EDIT:

Sulla base @ risposta di Melug, con l'aggiunta di impostazione dinamica percorso Python per affrontare il 'ovunque sul mio HD' parte della domanda:

import sys 
sys.path.append('c:\\my_projec_src_folder') 
from myproject import settings 
from django.core.management import setup_environ 
setup_environ(settings) 

risposta

22

È necessario attivare django ambiente prima:

from your_project import settings 
from django.core.management import setup_environ 
setup_environ(settings) 

Finalmente Importa i tuoi modelli, tutto va proprio come Django.

+18

'setup_environ (settings)' è obsoleto da Django 1.4! Il mio post qui sotto mostra un'alternativa che include un esempio. – Michael

27

Penso che il modo migliore sia creare il tuo custom management command(s). Quindi è possibile chiamare manage.py <yourcommand> da qualsiasi luogo.

+4

Migliore opzione a lungo termine. –

+0

Sono d'accordo, questa è la strada da percorrere. Non è molto più difficile della creazione di uno script autonomo e molto più robusto. –

+1

Anche se è vero, a volte è ancora necessario utilizzare i modelli django da altri script. – Rebs

100

Dal momento che Django 1.4 si dovrebbe evitare di utilizzare setup_environ(settings) (post di Melug) perché è deprecato. Utilizzare il seguente invece e sarete in grado di accedere al modello di

import os 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings") 

# your imports, e.g. Django models 
from your_project_name.models import Location 

# From now onwards start your script.. 

Ecco un esempio per accedere e modificare il proprio modello:

if __name__ == '__main__':  
    # e.g. add a new location 
    l = Location() 
    l.name = 'Berlin' 
    l.save() 

    # this is an example to access your model 
    locations = Location.objects.all() 
    print locations 

    # e.g. delete the location 
    berlin = Location.objects.filter(name='Berlin') 
    print berlin 
    berlin.delete() 

modello Esempio:

class Location(models.Model): 
    name = models.CharField(max_length=100) 
+1

questo è davvero come è fatto ora e funziona perfettamente. –

+3

Questo ha funzionato per me solo dopo aver spostato os.environ.setdefault ("DJANGO_SETTINGS_MODULE", "your_project_name.settings") sulla linea immediatamente dopo l'importazione. Altrimenti, questa è una soluzione molto migliore. –

+0

Buon punto, Peter! Forse alcune importazioni di modelli funzionano solo dopo la riga 'os.environ.setdefault (...)'. Ho riorganizzato le importazioni nel mio post, ora dovrebbe funzionare per tutti. PS: se ti piace questa soluzione ancora meglio, votala per favore. Grazie! – Michael

64

Per ottenere anche i modelli sono stati caricati, ho dovuto combinare questo con this answer, altrimenti ricevo django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet

import os 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings") 
import django 
django.setup() 

Come extra, aggiungo questo al __init__.py dei miei progetti Django, si scoprirà automaticamente il nome dell'applicazione, quindi è copia/incolla-grado:

import os 


def setup(): 
    module = os.path.split(os.path.dirname(__file__))[-1] 
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{}.settings".format(module)) 
    import django 
    django.setup() 

Allora posso solo fare:

from <app> import setup 
setup() 
+4

Grazie, apparentemente è necessario chiamare setup() poiché ** Django 1.7 **. – Phae7rae

+1

Il setup() in init è bello, lo adoro! – ulath

+0

Questa dovrebbe essere la risposta corretta ora. L'unica soluzione che funziona per me. – theeastcoastwest

2

Ecco la risposta per le versioni Django> 1.4:

from django.core.management import settings 
from myproject.myproject import settings as project_settings 

if not settings.configured: 
    settings.configure(default_settings=project_settings) 
4

PER DJANGO 1.11

soluzioni superiori non ha funzionato, ma mi ha dato un errore:

django.core.exceptions.AppRegistryNotReady: Apps non sono ancora caricati.

Per me la soluzione da here elaborato:

import os 
from django.core.wsgi import get_wsgi_application 

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings' 
application = get_wsgi_application() 
13

per Django versione 1.9 o successiva è possibile utilizzare questo:

import sys 
import os 
import django 

sys.path.append('your_project_directory') 
os.environ['DJANGO_SETTINGS_MODULE'] = 'your_project.settings' 
django.setup() 

from yourapp.models import your_model 

in modo da poter utilizzare l'oggetto come lo stesso oggetto django:

from myapp.models. import Locations 
all_locations = Locations.object.all() 
first_location = Locations.object.get(id=1) 
print first_location.name() 
first_location.save() 
1

Almeno da Django 1.11, l'app principale include un wsgi m odule che fa la configurazione necessaria all'importazione. Supponendo myproject/myproject è dove il vostro settings.py è, nello script appena importazione:

from myproject.wsgi import application 
0

Se si ottiene:

django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet. 

Prova:

import os 
from django.core.wsgi import get_wsgi_application 

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings') 
application = get_wsgi_application() 
0

Prova:

os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"

se os.environ.setdefault non funziona. (Windows 10, python3.6.4, django 2.0.3)

Problemi correlati