J'écris un script pour importer des objets de modèle dans la base de données utilisée par mon application Django. Dans le passé, j'ai résolu ce problème en exécutant ./manage.py Shell
, puis import myscript
. Je suis sûr qu'il existe un meilleur moyen. J'aimerais pouvoir appeler un script de n'importe où sur mon disque dur à l'aide de python scriptname.py
. Dans les premières lignes de ce script, il effectuerait toutes les importations/autres opérations nécessaires pour pouvoir accéder aux objets du modèle et se comporter comme s'il était. exécuter en utilisant manage.py Shell
.
Que dois-je ajouter à mon script pour y parvenir?
MODIFIER:
Basé sur la réponse de @ Melug, avec l'ajout de la définition dynamique du chemin Python pour répondre à la partie "n'importe où sur mon HD" de la question:
import sys
sys.path.append('c:\\my_projec_src_folder')
from myproject import settings
from Django.core.management import setup_environ
setup_environ(settings)
Vous devez d'abord configurer l'environnement Django:
from your_project import settings
from Django.core.management import setup_environ
setup_environ(settings)
Enfin, importez vos modèles, tout se passe comme Django.
Depuis Django 1.4 vous devriez éviter d'utiliser setup_environ(settings)
(post par Melug) car il est obsolète. Utilisez plutôt ce qui suit et vous pourrez accéder à votre modèle
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..
Voici un exemple pour accéder et modifier votre modèle:
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()
Exemple de modèle:
class Location(models.Model):
name = models.CharField(max_length=100)
Pour que les modèles soient chargés aussi, je devais combiner ceci avec cette réponse , sinon je reçois Django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet
import os
os.environ.setdefault("Django_SETTINGS_MODULE", "my_project.settings")
import Django
django.setup()
En plus, j'ajoute ceci au __init__.py
de mes projets Django, il détectera automatiquement le nom de l'application pour qu'il soit copié/collé:
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()
Alors je peux juste faire:
from <app> import setup
setup()
Je pense que le meilleur moyen est de créer votre commande (s) de gestion personnalisée . Ensuite, vous pouvez appeler manage.py <yourcommand>
de n'importe où.
Pour Django version 1.9 ou ultérieure, vous pouvez utiliser ceci:
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
afin que vous puissiez utiliser objet comme même objet 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()
FOR Django 1.11
Les solutions supérieures ne fonctionnaient pas, mais m'ont provoqué une erreur:
Django.core.exceptions.AppRegistryNotReady: Les applications ne sont pas encore chargées.
Pour moi la solution de ici a fonctionné:
import os
from Django.core.wsgi import get_wsgi_application
os.environ['Django_SETTINGS_MODULE'] = 'myapp.settings'
application = get_wsgi_application()
Depuis au moins Django 1.11, votre application principale comprend un module wsgi qui effectue la configuration nécessaire à l’importation. En supposant que myproject/myproject
est où se trouve votre settings.py, dans votre script, importez simplement:
from myproject.wsgi import application
Voici la réponse pour les versions de 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)
Essayer:
os.environ["Django_SETTINGS_MODULE"] = "mysite.settings"
si os.environ.setdefault
ne fonctionne pas. (Windows 10, python3.6.4, Django 2.0.3)
Si vous obtenez:
Django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
Essayer:
import os
from Django.core.wsgi import get_wsgi_application
os.environ.setdefault('Django_SETTINGS_MODULE', 'myapp.settings')
application = get_wsgi_application()
Comme Stavros l'a souligné ici , vous pouvez simplement copier le fichier wsgi.py et le mettre au début de votre script. Outre la configuration de Django_SETTINGS_MODULE, vous devez également obtenir les applications. J'espère que ça aide. Cela fonctionne pour moi à 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()