webentwicklung-frage-antwort-db.com.de

Django-Skript für den Zugriff auf Modellobjekte ohne die manage.py-Shell

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)
54
Trindaz

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.

21
Melug

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)
116
Michael

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()
87
Rebs

Ich denke, der beste Weg ist, Ihre benutzerdefinierten Verwaltungsbefehle zu erstellen. Dann können Sie manage.py <yourcommand> von überall aus anrufen.

33
DrTyrsa

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()
21
Alkindus

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()
4
Henhuy

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

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)
2
ISP

Versuchen:

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

wenn os.environ.setdefault nicht funktioniert. (Windows 10, Python3.6.4, Django 2.0.3) 

0
yvesva

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()
0
juan Isaza

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()
0
user1422543