Ich schreibe ein Skript, um einige Modellobjekte in die Datenbank zu importieren, die meine Django-Anwendung verwendet. In der Vergangenheit habe ich dies durch Ausführen von ./manage.py Shell
und dann import myscript
gelöst. Ich bin sicher, dass es einen besseren Weg gibt. Ich möchte in der Lage sein, ein Skript von überall auf meiner HD mit python scriptname.py
aufzurufen, und in den ersten Zeilen dieses Skripts würde es alle erforderlichen Import-/sonstigen Vorgänge ausführen, damit es auf Modellobjekte zugreifen und sich so verhalten kann, als wäre es mit manage.py Shell
ausführen.
Was muss ich meinem Skript hinzufügen, um dies zu erreichen?
BEARBEITEN:
Basierend auf der Antwort von @ Melug, mit zusätzlichem dynamisch einstellbaren Python-Pfad, um den "irgendwo auf meiner HD" -Teil der Frage anzusprechen:
import sys
sys.path.append('c:\\my_projec_src_folder')
from myproject import settings
from Django.core.management import setup_environ
setup_environ(settings)
Sie müssen zuerst die Django-Umgebung einrichten:
from your_project import settings
from Django.core.management import setup_environ
setup_environ(settings)
Beim letzten Import Ihrer Modelle geht alles wie bei Django.
Seit Django 1.4 sollten Sie die Verwendung von setup_environ(settings)
(post von Melug) vermeiden, da dies veraltet ist. Verwenden Sie stattdessen die folgenden Anweisungen, und Sie können auf Ihr Modell zugreifen
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..
Hier ein Beispiel, um auf Ihr Modell zuzugreifen und es zu ändern:
if __== '__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()
Beispielmodell:
class Location(models.Model):
name = models.CharField(max_length=100)
Um auch Modelle geladen zu bekommen, musste ich dies mit diese Antwort kombinieren, sonst bekomme ich Django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet
import os
os.environ.setdefault("Django_SETTINGS_MODULE", "my_project.settings")
import Django
django.setup()
Als Extra füge ich dies dem __init__.py
meiner Django-Projekte hinzu. Der App-Name wird automatisch erkannt, sodass er kopiert/eingefügt werden kann:
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()
Dann kann ich einfach machen:
from <app> import setup
setup()
Ich denke, der beste Weg ist, Ihre benutzerdefinierten Verwaltungsbefehle zu erstellen. Dann können Sie manage.py <yourcommand>
von überall aus anrufen.
Für Django Version 1.9 oder höher können Sie Folgendes verwenden:
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
so können Sie ein Objekt als das gleiche Django-Objekt verwenden:
from myapp.models. import Locations
all_locations = Locations.object.all()
first_location = Locations.object.get(id=1)
print first_location.name()
first_location.save()
FOR Django 1.11
Obere Lösungen funktionierten nicht, gaben mir jedoch einen Fehler:
Django.core.exceptions.AppRegistryNotReady: Apps sind noch nicht geladen.
Für mich Lösung von hier erarbeitete:
import os
from Django.core.wsgi import get_wsgi_application
os.environ['Django_SETTINGS_MODULE'] = 'myapp.settings'
application = get_wsgi_application()
Seit mindestens Django 1.11 enthält Ihre Haupt-App ein Wsgi-Modul, das die erforderlichen Einstellungen beim Import ausführt. Angenommen, myproject/myproject
ist, wo sich Ihre Einstellungen.py befindet, importieren Sie einfach in Ihr Skript:
from myproject.wsgi import application
Hier ist die Antwort für Django-Versionen> 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)
Versuchen:
os.environ["Django_SETTINGS_MODULE"] = "mysite.settings"
wenn os.environ.setdefault
nicht funktioniert. (Windows 10, Python3.6.4, Django 2.0.3)
Wenn du bekommst:
Django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
Versuchen:
import os
from Django.core.wsgi import get_wsgi_application
os.environ.setdefault('Django_SETTINGS_MODULE', 'myapp.settings')
application = get_wsgi_application()
Wie Stavros auf hier hingewiesen hat, können Sie einfach die Datei wsgi.py kopieren und an den Anfang Ihres Skripts setzen. Neben dem Einrichten von Django_SETTINGS_MODULE müssen Sie auch die Anwendungen abrufen. Ich hoffe es hilft. Es funktioniert für mich bei Django 2.1.5.
import os
from Django.core.wsgi import get_wsgi_application
os.environ.setdefault('Django_SETTINGS_MODULE', 'revochem.settings')
application = get_wsgi_application()