web-dev-qa-db-fra.com

Script Django pour accéder aux objets du modèle sans utiliser le shell manage.py

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

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.

21
Melug

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

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

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ù.

33
DrTyrsa

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

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

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

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

Essayer:

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

si os.environ.setdefault ne fonctionne pas. (Windows 10, python3.6.4, Django 2.0.3) 

0
yvesva

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

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