2013-02-24 6 views
43

Ich habe setup_environ() eine Weile zurück, um ein einmaliges Python-Skript zu schreiben, das von der Befehlszeile ausgeführt wurde, die wirklich nicht sehr gut als ein benutzerdefinierter manage.py-Befehl passte (meine bevorzugte Wahl). Es hat alles schön eingerichtet. Ich nehme an, wir haben diese Funktion aufgegeben, weil Nicht-Django-Pythonistas sich über Djangonauts für magisches Zeug wie dieses lustig machen und wir es satt haben, uns schmutzig zu fühlen. Also, wenn es veraltet ist, was ist die Alternative? Vielleicht ist das eine faule Frage, aber was muss ich anstelle von setup_environ ausführen, um denselben Effekt zu erzielen? Ich denke, ich könnte die Funktion in mein Skript kopieren/einfügen, aber ich gehe davon aus, dass das nicht der Zweck war, sie abzulehnen. (natürlich kann ich immer noch eine veraltete Funktion verwenden, aber ich möchte, dass mein Skript einige Versionen von Django überlebt)Alternative zum veralteten setup_environ() für einmalige Django-Skripte?

Antwort

55

Dies hat in Django 1.7

geändert
import os 
import django 
from myapp import models 

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

print models.MyModel.objects.get(pk=1) 
+1

dies funktioniert nicht für mich auf 1.7.3 django.setup() AttributeError: 'Modul' Objekt hat kein Attribut 'Setup' – Harry

+0

Überprüfen Sie, um sicherzustellen, dass Sie die Dinge richtig importieren (und stellen Sie sicher, dass Ihr Pfad korrekt ist) . Die Setup-Funktion sollte in 1.7.3 da sein: https://github.com/django/django/blob/1.7.3/django/__init__.py –

+1

django.setup() wurde in 1,8 django Version hinzugefügt. es wird nicht in 1.7 funktionieren. https://docs.djangoproject.com/en/1.8/topics/settings/ – javed

21

Django 1.4 Release Notes empfehlen offiziell, django.conf.settings.configure() zu verwenden, um die Einstellungen festzulegen. Das ist gut für kleine Skripte, für die man alles "pythonisch" machen muss. Wenn Sie jedoch ein größeres Projekt haben, verwende ich gerne den Django-Ansatz, der ein separates Einstellungsmodul/Paket und dann seinen Pfad in der Umgebungsvariablen DJANGO_SETTINGS_MODULE haben soll. Dies ist der Ansatz, der in manage.py verwendet wird:

# manage.py 

# ... 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "fooproject.settings") 
# ... 

Veröffentlichung docs here gefunden werden kann.

+2

Mit Django 1.6 hat 'manage.py' jetzt die Zeile wie vorgeschlagen:' os.environ.setdefault ("DJANGO_SETTINGS_MODULE", "myproject.settings") 'und trotzdem, wenn ich versuche eine Shell zu starten, wirft es immer noch die gleicher Fehler wie in der ursprünglichen Frage. –

28

Um auf miki725 Antwort zu erweitern, wenn vor Ihnen

hatte
from django.core.management import setup_environ 

import fooproject.settings as settings 
setup_environ(settings) 

nur mit

import os 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "fooproject.settings") 
from django.conf import settings 

und Ihre Einstellungen als Einstellungen ersetzt geladen.

Für Django 1.7+, siehe die Lösung von Ben Davis.

+1

Dies funktioniert bei mir nicht mit django 1.6 - Ich habe den Projektpfad (nicht die App) zu sys.path hinzugefügt, ich habe das Einstellungsmodell zu DJANGO_SETTINGS_MODULE hinzugefügt und dann Einstellungen aus django.conf importiert, aber wenn ich es dann versuche und Importieren Sie eines meiner Datenbankmodelle (aus shoppinglist.models Import ShoppingList) es gibt einen Fehler "Kein Modul namens Modelle". Die gleiche Import-Zeile funktioniert innerhalb der Shell, die über manage.py gestartet wird. Irgendwelche Ideen? – frankster

+0

Wenn Sie keine Modelle importieren können, klingt es so, als wären Ihre Pfadwerte nicht korrekt eingestellt, was außerhalb der Einstellungsfrage liegt. Sie sollten versuchen, in einer regulären Python-Shell zu testen, die mit "python" anstelle der django-Shell gestartet wurde, die mit "manage.py shell" gestartet wurde, um Ihre Pfade zu debuggen. –

1

Disclaimer: I'm using Django 1.8

gerade hinzufügen, meine 2 Cent: Ich habe einige der Lösungen auf dieser Seite vorgestellt versucht, aber sie did't überhaupt gearbeitet. Ich habe gerade eine Lösung gefunden, die ich unten teile.

Stellen Sie sicher, dass Sie sich im Stammordner Ihres Projekts befinden. Das gleiche, wo manage.py befindet.

#make sure basic imports are in place 
>>> import os,django 

#set the specific django settings file 
>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "main.settings.base") 

# import your modules and use them just like you do in your 
# web apps 
>>> from apps.customers import models as c 

# normal usage... for instance: 
>>> dir(c) 
['You', 'Will', 'See', 'Your', 'Models', ... ] 
+0

was soll ich tun, wenn ich nicht in der Wurzel bin? – Alexis

2

Hinzufügen zu, was Leandro N sagte (danke, Leandro!), Man muss hinzufügen django.setup().

Zum Beispiel mein Code:

import os, django 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') 
django.setup() 
from app.models import ModelA, ModelB 

FYI, ich bin auf Django 1.10.

Verwandte Themen