web-dev-qa-db-fra.com

Utiliser la couche de base de données Django en dehors de Django?

J'ai créé une base de données Nice dans Django et j'aimerais communiquer avec certains scripts python en dehors de mon site Web. Je suis donc curieux de savoir s'il est possible d'utiliser l'API de base de données Django en dehors d'un site Django, et si tel est le cas, quelqu'un at-il des informations sur la manière de le faire? Google n'a pas donné beaucoup de résultats pour cela.

59
Sean McAllister

Avant de faire un appel, vous devez simplement configurer les paramètres Django, y compris pour importer vos modèles. Quelque chose comme ça:

from Django.conf import settings
settings.configure(
    DATABASE_ENGINE = 'postgresql_psycopg2',
    DATABASE_NAME = 'db_name',
    DATABASE_USER = 'db_user',
    DATABASE_PASSWORD = 'db_pass',
    DATABASE_Host = 'localhost',
    DATABASE_PORT = '5432',
    TIME_ZONE = 'America/New_York',
)

Encore une fois, assurez-vous d’exécuter ce code avant d’exécuter, par exemple:

from your_app.models import *

Ensuite, utilisez simplement l’API de base de données comme d’habitude.

59
FogleBird

Pour Django 1.7, j’ai utilisé ce qui suit pour être opérationnel.

settings.py:

from Django.conf import settings
settings.configure(
    DATABASES={
        'default': {
            'ENGINE': 'Django.db.backends.postgresql_psycopg2',
            'NAME': 'name',
            'USER': 'usr',
            'PASSWORD': 'secret',
            'Host': '127.0.0.1',
            'PORT': '5432',
        },
    },
    TIME_ZONE='America/Montreal',
)

Dans le fichier contenant la routine de démarrage

import os
import Django

import v10consolidator.settings
from myapp.models import *

os.environ.setdefault(
    "Django_SETTINGS_MODULE",
    "myapp.settings"
)
Django.setup()
14
Gab

Update setup_environ doit être supprimé dans Django 1.6

Si vous parvenez à importer votre fichier settings.py, alors jetez un oeil at handy setup_environ.

from Django.core.management import setup_environ
from mysite import settings

setup_environ(settings)

#here you can do everything you could in your project
12
Dmitry Shevchenko

Une dernière option à ne pas mentionner: une sous-commande custom ./manage.py .

7
Daniel Roseman

Pour Django 1.5 sur (plusieurs bases de données sont prises en charge), les paramètres de DATABASE ont également été modifiés . Vous devez adapter la réponse précédente à ...

settings.configure(
    DATABASES = { 'default': {
        'ENGINE': 'Django.db.backends.postgresql_psycopg2',
        'NAME': 'db_name',
        'USER': 'db_usr',
        'PASSWORD': 'db_pass',
        'Host': '',
        'PORT': '',
        }, },
    TIME_ZONE = 'Europe/Luxembourg'
)
3
G. Schutz
import os, sys

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
os.environ.setdefault("Django_SETTINGS_MODULE", "project_name.settings")
sys.path.append(os.path.abspath(os.path.join(BASE_DIR, os.pardir)))

from Django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

from app.models import MyModel
2
shankypy

Pour utiliser Django ORM à partir d'autres applications, vous avez besoin des éléments suivants:

1) export Django_SETTINGS_MODULE=dproj.settings

2) Ajoutez votre dossier d'application Django au chemin (vous pouvez le faire dans le code de votre application non-Django):

sys.path = sys.path + ['/path/to/your/app/']

3) Si vous utilisez SQLite, utilisez le chemin complet du fichier de base de données dans settings.py:

DATABASE_NAME = '/path/to/your/app/base.db'
2
Juanjo Conti

Voici le code que j'utilise. Il suffit de remplacer your_project par votre nom de projet Django, yourApp par votre nom d'application Django, any_model par le modèle que vous souhaitez utiliser dans le fichier de modèle et any_fild par le champ que vous souhaitez obtenir de la base de données:

from Django.conf import settings
import Django

from your_project.settings import DATABASES, INSTALLED_APPS
settings.configure(DATABASES=DATABASES, INSTALLED_APPS=INSTALLED_APPS)
Django.setup()

from yourApp.models import *
print(any_model.objects.all()[0].any_fild)
1
Mahdi Heidari kia

Basé sur la réponse de Hai Hu , voici un script fonctionnel, testé sur Django 1.10 et 1.11 . J'ai d'abord importé les applications de base de Django car elles sont nécessaires dans de nombreuses autres applications. 

import os
from Django.conf import settings
from Django.apps import apps

conf = {
    'INSTALLED_APPS': [
        'Django.contrib.admin',
        'Django.contrib.auth',
        'Django.contrib.contenttypes',
        'Django.contrib.messages',
        'Django.contrib.sessions',
        'Django.contrib.sitemaps',
        'Django.contrib.sites',
        'Django.contrib.staticfiles',
        '<your_app>',
    ],
    'DATABASES': {
        'default': {
            'ENGINE': os.environ.get('DB_ENGINE'),
            'NAME': os.environ.get('DB_NAME'),
            'USER': os.environ.get('DB_USER'),
            'PASSWORD': os.environ.get('DB_PASSWORD'),
            'Host': os.environ.get('DB_Host'),
            'PORT': os.environ.get('DB_PORT'),
        }
    },
    'TIME_ZONE': 'UTC'
}

settings.configure(**conf)
apps.populate(settings.INSTALLED_APPS)

<import your app models here>
0
Rani